使django模板严格

使django模板严格,django,django-templates,django-errors,Django,Django Templates,Django Errors,在django模板中,如果未定义var,对{{var}}的调用将自动失败。这使得模板很难调试。是否有一个设置我可以切换,以便django在这种情况下抛出异常 我在网上找到的一个解决方案的唯一提示是,这听起来非常骇人听闻。Django=1.10 设置string\u if\u invalid='调试警告:未找到未定义的模板变量[%s'settings.py中的模板选项 见文件: 另见: 这是设计的一部分。它允许您提供默认值,并根据上下文中是否存在变量进行切换。它还允许模板非常灵活,并促进模板的可重

在django模板中,如果未定义
var
,对
{{var}}
的调用将自动失败。这使得模板很难调试。是否有一个设置我可以切换,以便django在这种情况下抛出异常

我在网上找到的一个解决方案的唯一提示是,这听起来非常骇人听闻。

Django=1.10

设置
string\u if\u invalid='调试警告:未找到未定义的模板变量[%s'
settings.py中的模板选项

见文件:

另见:
这是设计的一部分。它允许您提供默认值,并根据上下文中是否存在变量进行切换。它还允许模板非常灵活,并促进模板的可重用性,而不是严格的“每个视图都必须有自己的模板”方法

更重要的是,模板实际上不应该被“调试”。其思想是将尽可能多的逻辑放在模板之外的视图或模型中。如果您想弄清楚为什么应该传递给上下文的变量不存在,那么调试的位置就在您的视图中。只需放下
导入pdb;pdb.set_trace()

# settings.py
class InvalidVarException(object):
    def __mod__(self, missing):
        try:
            missing_str = unicode(missing)
        except:
            missing_str = 'Failed to create string representation'
        raise Exception('Unknown template variable %r %s' % (missing, missing_str))
    def __contains__(self, search):
        if search == '%s':
            return True
        return False

TEMPLATE_DEBUG = True
TEMPLATE_STRING_IF_INVALID = InvalidVarException()

考虑使用django shouty模板应用程序:

这个应用程序应用了一个monkeypatch,它迫使Django的模板语言对无效的假设产生更大的错误。具体而言:

  • chef
    如果调用变量
    sous\u chef
    ,将引发异常
  • chef.can\u add\u cakes
    如果
    can\u add\u cakes
    不是chef的有效属性/属性/方法,则会引发异常
这不是编译时安全性,但总比因为忘记了什么而默默地接受错误要好

我用这个:


这样,如果我运行测试,就会出现异常。

指定链接中的方法1看起来不错。因为,自定义模板标记是扩展模板功能的合法选项。
template\u STRING\u IF\u INVALID='%s'
更合适,因为它将打印未定义的变量名,而不是一些随机文本。但是,请仔细阅读第二个链接上的警告框。这确实适用于一次性调试实例,而不是在开发过程中一直保持打开状态。当我们试图在模板中打印无效变量时,模板字符串无效设置将有助于查找无效变量,但如果该变量用于IF语句或作为for循环中的集合,找不到任何帮助。。。是否有任何方法也可以捕获这些情况?如果变量未定义,是否有方法引发异常?请更新您的答案以考虑django 1.10+,其中
TEMPLATE\u STRING\u INVALID
已被弃用。'OPTIONS':{'STRING\u if\u INVALID':'INVALID varialbe!'@马辛:我是从詹戈的角度讲的。如果您在开发中依赖模板调试错误来处理与摸索模板标签或其他简单错误无关的事情,那么您的模板中可能有太多的逻辑。好吧,这是一个意见问题:)但这是“Django意见”,如果对您足够重要,请使用不同的模板引擎!我知道,因为这个原因,@AdamKG,还有什么引擎可以使用严格的模板呢?Goes Jinja2有这个功能吗?@Eldamir:显然,这似乎并没有检测到
{%if foobar%}
{%for foobar%}
中未定义的foobar,从1.9.x>1.10.1升级后,我得到:
?:(templates.E002)'string\u if\u invalid'在模板选项中必须是字符串,但得到:(InvalidVarException).
所以这个黑客不再有效了。@allcaps如果你从
基串
unicode
继承它怎么办?@utapyngo I使系统检查静音:
静音\u系统检查=['templates.E002']
。另一种不使系统检查静音的方法是:将InvalidVarException的超类改为unicode而不是object,将参数改为InvalidVarException(“%s”)。顺便说一句,它的工作,但我没有得到正确的模板行在哪里崩溃了。有什么办法吗?谢谢你的提示!
[pytest]
FAIL_INVALID_TEMPLATE_VARS = True