嗯,我找不到答案,我确信这很简单,但我不知道如何让它在Django找不到变量时起作用
我尝试使用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()%}
答案 0 :(得分:8)
您正在尝试任意深入到未定义的数据中。 menu_links
未定义,因此Jinja2会为您的UndefinedSilently
类创建一个新实例。然后,它调用此对象的__getattr__
方法来获取items
属性。这将返回一个空的unicode字符串。然后尝试调用哪个Python(()
的{{1}})。这引发了unicode对象不是callables的错误。
那是:
menu_links.items()
如果您希望能够深入到一个级别,则可以创建一个类,以便为除menu_links.items() # becomes
UndefinedSilently().items() # becomes
UndefinedSilently().u''() # from UndefinedSilently.__getattr__
和__str__
之外的每次访问尝试返回自己。
__unicode__
答案 1 :(得分:1)
这是一个老问题,但它解决了一个相关问题。我复活/回答这个是为了帮助其他人参考 Django 3.1/3.2:
转到您的 settings.py
。
在“选项”中添加以下内容:
'undefined': jinja2.Undefined
有了这个,未定义的变量在渲染时不会出现,即“静默”。完整代码应如下所示:
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [
BASE_DIR / 'templates-jinja2'
],
'APP_DIRS': True,
'OPTIONS': {
'environment': 'config.jinja2.environment',
'context_processors': [],
'undefined': jinja2.DebugUndefined
},
},
或者,您可以使用 DebugUndefined
查看未定义的变量,或使用 'StrictUndefined'
在使用未定义的变量时引发异常。