在渲染过程中,如何使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}}'
答案 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" %}