jinja2: Как заставить его потерпеть неудачу Тихо, как djangotemplate - PullRequest
4 голосов
/ 31 мая 2011

Ну, я не могу найти ответ, я уверен, что это очень просто, но я просто не понимаю, как заставить его работать, как Django, когда не находит переменную

iпопытался использовать Undefined и создать свой собственный undefined, но это вызывает у меня проблемы с ошибками атрибутов и т. д.

def silently(*args, **kwargs):
    return u''

class UndefinedSilently(Undefined):
    __unicode__ = silently
    __str__ = silently
    __call__ = silently
    __getattr__ = silently

, но когда я пытаюсь сделать это здесь, происходит сбой TypeError: 'unicode' object is not callable:

{%for dir_name, links in menu_links.items()%}

1 Ответ

8 голосов
/ 31 мая 2011

Вы пытаетесь проникнуть сколь угодно глубоко в ваши неопределенные данные. menu_links не определено, поэтому Jinja2 создает новый экземпляр вашего UndefinedSilently класса. Затем он вызывает метод __getattr__ этого объекта, чтобы получить атрибут items. Это возвращает пустую строку Unicode. Какой Python затем пытается вызвать (() из menu_links.items()). Что приводит к ошибке, что объекты Unicode не могут быть вызваны.

То есть:

menu_links.items() # becomes
UndefinedSilently().items() # becomes
UndefinedSilently().u''() # from UndefinedSilently.__getattr__

Если вы хотите пройти глубже, чем на один уровень, вы можете создать класс, который возвращает себя при каждой попытке доступа, за исключением __str__ и __unicode__.

def silently(*args, **kwargs):
    return u''

return_new = lambda *args, **kwargs: UndefinedSilently()

class UndefinedSilently(Undefined):
    __unicode__ = silently
    __str__ = silently
    __call__ = return_new
    __getattr__ = return_new
...