忽略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

如何使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}}'

我认为
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" %}

只有在少数地方无效时,我才会使用自定义的
字符串,这是解决我问题的一个很好的方法:)