【问题标题】:Ignore missing variables in Django templates忽略 Django 模板中缺少的变量
【发布时间】:2019-01-22 06:51:27
【问题描述】:

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

【问题讨论】:

    标签: django django-templates


    【解决方案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" %}
    

    【讨论】:

    • 我只会在少数地方使用自定义的string_if_invalid ,所以这是解决我问题的好方法:)
    猜你喜欢
    • 1970-01-01
    • 2017-09-18
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2012-04-21
    相关资源
    最近更新 更多