2013-05-04 3 views
4

Я использую Jinja2 в качестве механизма шаблона веб-сайта и все вспомогательные функции, используемые в шаблонах, которые я реализовал как макросы, но для одного. Это код Python:Python lambdas in Jinja2

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 lambdas. Это правда, и если да, то как лучше писать эту функцию (надеюсь, цикл здесь не нужен)?

ответ

2

зарегистрировать его в качестве фильтра:

your_jinja_env.filters['arrow_class'] = arrow_class_from_deg 

и в шаблоне:

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

вы можете использовать декораторы для управления дзиндзя фильтры легко:

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 
+1

Таким образом, невозможно реализовать в шаблонах? – aplavin

Смежные вопросы