忽略Django模板中缺少的变量
如何使Django(1.11)在渲染期间忽略模板中缺少的变量?我需要在多个步骤中使用不同的数据呈现相同的模板。我需要将Django模板引擎用于它包含的所有功能,我不能修改模板 而不是用空字符串替换它们:忽略Django模板中缺少的变量,django,django-templates,Django,Django Templates,如何使Django(1.11)在渲染期间忽略模板中缺少的变量?我需要在多个步骤中使用不同的数据呈现相同的模板。我需要将Django模板引擎用于它包含的所有功能,我不能修改模板 而不是用空字符串替换它们: >>> from django.template import Template, Context, TemplateSyntaxError >>> c = Context({'foo': 'hello'}) >>> t = Templat
>>> from django.template import Template, Context, TemplateSyntaxError
>>> c = Context({'foo': 'hello'})
>>> t = Template('{{foo}} {{bar}}')
>>> t.render(c)
'hello '
我想让他们保持原样
>>> t.render(c)
'hello {{bar}}'
我认为
string\u if\u invalid
适合您:
您的设置应添加如下内容:
TEMPLATES = [
{
...
'OPTIONS': {
...
'string_if_invalid': '{{%s}}',
...
},
},
]
@register.simple_tag(takes_context=True)
def preserve_invalid(context, var_name):
return context.get(var_name, '{{%s}}' % var_name)
{% preserve_invalid "some_var" %}
您可能需要避开花括号,但如果在替换中的字符串时它没有这样做,我会感到惊讶
请注意,从文档中可以看出:
如果字符串\u If\u invalid包含“%s”,则格式标记将替换为无效变量的名称
还要注意的是,文档中说:
仅用于调试目的
虽然string_if_invalid可能是一个有用的调试工具,但将其作为“开发默认值”打开是个坏主意
许多模板,包括管理站点中的模板,在遇到不存在的变量时依赖于模板系统的静默。如果将“”以外的值指定给字符串\u(如果\u无效),则这些模板和站点将遇到呈现问题
通常,只有在调试特定模板问题时才应启用字符串\u if\u invalid,然后在调试完成后清除该字符串
编辑:医生的警告让我对使用这个有点担心。尝试一下上面的调试,但我不会将其用于生产系统
您可能需要考虑编写自定义模板标记:
它的定义如下:
TEMPLATES = [
{
...
'OPTIONS': {
...
'string_if_invalid': '{{%s}}',
...
},
},
]
@register.simple_tag(takes_context=True)
def preserve_invalid(context, var_name):
return context.get(var_name, '{{%s}}' % var_name)
{% preserve_invalid "some_var" %}
使用方法如下:
TEMPLATES = [
{
...
'OPTIONS': {
...
'string_if_invalid': '{{%s}}',
...
},
},
]
@register.simple_tag(takes_context=True)
def preserve_invalid(context, var_name):
return context.get(var_name, '{{%s}}' % var_name)
{% preserve_invalid "some_var" %}
只有在少数地方无效时,我才会使用自定义的
字符串,这是解决我问题的一个很好的方法:)