Передача лямбд в шаблон в Django 1.2.4 работала нормально, после обновления моего кода до Django 1.3 я тоже столкнулся с этой проблемой.Я перестал пытаться установить флаг alters_data и попытался применить патч в билете 15791, который также добавляет флаг do_not_call_in_templates (очевидно, слился в версии dev).То, как я обошел проблему до тех пор, пока не было найдено правильное решение, заключалось в том, чтобы использовать фабричную функцию без аргументов, которые возвращали лямбду, вместо передачи лямбды в шаблон.
def return_a_lambda():
return lambda x : 'x=%s' % x
c = dict(f=return_a_lambda)
>>> c['f']
<function return_l at 0x33bc668>
template.Variable('f').resolve(c)
<function <lambda> at 0x33ccaa0>
Шаблон Django вызывает все переменные контекста какПока они не нуждаются в аргументе, следовательно, return_a_lambda выполняется, и шаблон получает лямбду взамен.
https://docs.djangoproject.com/en/dev/ref/templates/api/ в разделе «Рендеринг контекста»
Обновление: AМногоразовый хак будет фабричной функцией, которая возвращает фабричную функцию:
def encapsulate(func):
def wrapper():
return func
return wrapper
или более короткую версию:
def encapsulate(func):
return lambda: func
с окончательным кодом, похожим на это:
c = dict(f=encapsulate(lambda x : 'x=%s' % x))
что легче интерпретировать.В моем случае (https://github.com/rosarior/mayan) Теперь мне нужно сделать это примерно 30 раз, чтобы запустить код в Django 1.3: '(