4

私はウェブサイト テンプレート エンジンとして Jinja2 を使用し、テンプレートで使用されるすべてのヘルパー関数をマクロとして実装しましたが、1 つだけです。これは Python コードです。

def arrow_class_from_deg(angle):
    if angle is None:
        return ''
    arrow_directions = [
        (0, 'n'), (45, 'ne'), (90, 'e'), (135, 'se'), (180, 's'),
        (225, 'sw'), (270, 'w'), (315, 'nw'), (360, 'n')
    ]
    return min(arrow_directions, key=lambda (ang, _): abs(ang - angle))[1]

指定された角度に最も近い矢印の CSS クラスを返します。この関数はテンプレートでのみ使用されます (今後も使用される予定です)。そのため、テンプレートにも、つまりマクロとして実装することは理にかなっています。ただし、これを実行しようとすると、Jinja2 が Python ラムダをサポートしていないように見えることに気付きました。それは本当ですか、そうであれば、この関数をより適切に記述する方法は?

4

1 に答える 1

2

フィルターとして登録します。

your_jinja_env.filters['arrow_class'] = arrow_class_from_deg

そしてテンプレートで:

<something class="{{ angle | arrow_class }}">blah</something>

デコレーターを使用して、jinja フィルターを簡単に管理できます。

class Filter(object):
    def __init__(self, filter_name=None):
         self.filter_name = filter_name

    def __call__(self, function):
         my_jinja_env.filters[self.filter_name or function.__name__] = function
         return function

@Filter()
def i_love_you(name):
    ''' say I love you to the name you entered. 
    usage: {{ "John" | i_love_you }} => "I Love You, John!"'''

    return "I Love You, %s!" %name
于 2013-05-04T19:21:01.127 に答える