忽略Django模板中缺少的变量

时间:2018-08-15 11:35:46

标签: django django-templates

在渲染过程中,如何使Django(1.11)忽略模板中缺少的变量?我需要通过多个步骤来渲染具有不同数据的同一模板。我需要为它包含的所有功能使用Django模板引擎,并且我无法修改模板。

不是用空字符串替换它们:

>>> from django.template import Template, Context, TemplateSyntaxError

>>> c = Context({'foo': 'hello'})
>>> t = Template('{{foo}} {{bar}}')
>>> t.render(c)
'hello '

我希望只保留它们

>>> t.render(c)
'hello {{bar}}'

1 个答案:

答案 0 :(得分:1)

我认为string_if_invalid将为您服务:https://docs.djangoproject.com/en/1.11/ref/templates/api/#how-invalid-variables-are-handled

您的设置应添加以下内容:

TEMPLATES = [
    {
        ...
        'OPTIONS': {
            ...
            'string_if_invalid': '{{%s}}',
            ...
        },
    },
]

您可能需要使用花括号,但是如果替换字符串时没有为您这样做,我会感到惊讶。

请注意,从文档中说:

  

如果string_if_invalid包含'%s',则格式标记将替换为无效变量的名称。

还请注意文档说:

  

仅用于调试目的!

     

虽然string_if_invalid可能是有用的调试工具,但将其作为“开发默认设置”打开是一个坏主意。

     

当遇到不存在的变量时,许多模板(包括管理站点中的模板)都依赖于模板系统的静默状态。如果为string_if_invalid分配了除''之外的其他值,则这些模板和网站会出现渲染问题。

     

通常,只应启用string_if_invalid才能调试特定的模板问题,然后在调试完成后将其清除。

编辑:该文档的警告使我对使用此控件有些警惕。在上面尝试调试,但是我不会在生产系统上依靠它。

您可能要考虑编写自定义模板标签:https://docs.djangoproject.com/en/2.1/howto/custom-template-tags/#django.template.Library.simple_tag

它的定义如下:

@register.simple_tag(takes_context=True)
def preserve_invalid(context, var_name):
    return context.get(var_name, '{{%s}}' % var_name)

并以此方式使用:

{% preserve_invalid "some_var" %}