jinja2:如何让它失败像django模板一样无声

时间:2011-05-31 02:42:57

标签: python django-templates jinja2

嗯,我找不到答案,我确信这很简单,但我不知道如何让它在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()%}

2 个答案:

答案 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

  1. 转到您的 settings.py

  2. 在“选项”中添加以下内容:

    'undefined': jinja2.Undefined
    
  3. 有了这个,未定义的变量在渲染时不会出现,即“静默”。完整代码应如下所示:

    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [
            BASE_DIR / 'templates-jinja2'
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': 'config.jinja2.environment',
            'context_processors': [],
            'undefined': jinja2.DebugUndefined
    
        },
    },
    
  4. 或者,您可以使用 DebugUndefined 查看未定义的变量,或使用 'StrictUndefined' 在使用未定义的变量时引发异常。