在Django模板中显示未定义的变量错误?

Dav*_*ver 19 django django-templates

我怎么能让Django在遇到它时告诉我,例如,在渲染模板时出现未定义的变量错误?

我已经尝试了明显的DEBUG = TrueTEMPLATE_DEBUG = True,但他们没有帮助.

sla*_*acy 26

把它放在你的调试设置中:

class InvalidString(str):
    def __mod__(self, other):
        from django.template.base import TemplateSyntaxError
        raise TemplateSyntaxError(
            "Undefined variable or unknown value for: \"%s\"" % other)

TEMPLATE_STRING_IF_INVALID = InvalidString("%s")
Run Code Online (Sandbox Code Playgroud)

当模板引擎看到或发现未定义的值时,这应该引发错误.


wli*_*iao 10

根据django文档,默认情况下,未定义的变量被视为''(空字符串).虽然如果重新组合,这是.如果要识别变量undefined,请在设置中更改TEMPLATE_STRING_IF_INVALID.'%s'使无效变量呈现为其变量名,这样,您就可以轻松识别. 如何-无效的变量,是长柄

  • 另一个技巧是将TEMPLATE_STRING_IF_INVALID设置为"%s%s",这将导致引发格式错误.对于更干净的东西,请参阅我的回答 (3认同)

Fli*_*imm 5

如何在模板中的未定义变量上记录警告

似乎Django依赖于未定义的变量,它是一个简单的空字符串。因此,与其更改此行为或使其引发异常,不如让它保持不变,而是让它记录警告!

在您的settings.py文件中:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # ...
        'OPTIONS': {
            # ...
            'string_if_invalid': InvalidStringShowWarning("%s"),
        },
    }
]
Run Code Online (Sandbox Code Playgroud)

string_if_invalid替换TEMPLATE_STRING_IF_INVALID为较新的Django版本。)

进一步,您需要定义InvalidStringShowWarning该类,使其在记录警告时起作用:

class InvalidStringShowWarning(str):
    def __mod__(self, other):
        import logging
        logger = logging.getLogger(__name__)
        logger.warning("In template, undefined variable or unknown value for: '%s'" % (other,))
        return ""
Run Code Online (Sandbox Code Playgroud)

您应该能够在的输出中看到警告python manage.py runserver


Bea*_*eau 5

查找上下文中不存在的模板变量对我来说很重要,因为有几次错误使其进入生产环境,因为视图已更改但模板未更改。

我使用了在manage.py中实现的这种技术,以在使用上下文中未找到的模板变量时实现破坏测试的效果。请注意,此技术适用于for循环和if语句,而不仅仅是{{ variables }}.

import sys

# sometimes it's OK if a variable is undefined:
allowed_undefined_variables = [
    'variable_1',
    'variable_2',
]

if 'test' in sys.argv:
    import django.template.base as template_base

    old_resolve = template_base.Variable.resolve

    def new_resolve(self, context):
        try:
            value = old_resolve(self, context)
        except template_base.VariableDoesNotExist as e:
            # if it's not a variable that's allowed to not exist then raise a
            # base Exception so Nodes can't catch it (which will make the test
            # fail)
            if self.var not in allowed_undefined_variables:
                raise Exception(e)

            # re-raise the original and let the individual Nodes deal with it
            # however they'd like
            raise e

        return value

    template_base.Variable.resolve = new_resolve
Run Code Online (Sandbox Code Playgroud)