严格制作django模板

时间:2012-01-24 16:17:44

标签: django django-templates django-errors

在django模板中,如果{{ var }}未定义,则对var的调用将无声地失败。这使模板难以调试。有没有我可以切换的设置,所以django会在这种情况下抛出异常?

我在网上找到的解决方案的唯一提示是http://groups.google.com/group/google-appengine/browse_thread/thread/86a5b12ff868038d,这听起来非常糟糕。

5 个答案:

答案 0 :(得分:6)

<强>的Django&LT = 1.9

TEMPLATE_STRING_IF_INVALID = 'DEBUG WARNING: undefined template variable [%s] not found'

中设置settings.py

见文档:
https://docs.djangoproject.com/en/1.9/ref/settings/#template-string-if-invalid

<强>的Django&GT = 1.10

string_if_invalid = 'DEBUG WARNING: undefined template variable [%s] not found'

中设置settings.py模板选项

请参阅文档:https://docs.djangoproject.com/en/2.0/topics/templates/#module-django.template.backends.django

同时阅读: http://docs.djangoproject.com/en/dev/ref/templates/api/#invalid-template-variables

答案 1 :(得分:3)

来自djangosnippets的hack会在模板中遇到未定义的变量时引发异常。

# 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()

答案 2 :(得分:1)

考虑使用django-shouty-templates应用程序:https://pypi.org/project/django-shouty-templates/

此应用程序应用了一个猴子补丁,该补丁迫使Django的模板语言对无效假设的错误提示更大。具体来说:

    如果变量名为chef
  • sous_chef会引发异常。
  • 如果chef.can_add_cakes不是厨师的有效属性/属性/方法,
  • can_add_cakes将引发异常

这不是编译时间安全的方法,但是它比静默地吞下错误要好,因为您忘记了一些东西!

答案 3 :(得分:0)

我用这个pytest-django config

[pytest]
FAIL_INVALID_TEMPLATE_VARS = True

这样我在运行测试时会得到一个异常。

答案 4 :(得分:-2)

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

更重要的是,模板实际上不应该被“调试”。我们的想法是在视图或模型中尽可能多地将放在 模板之外。如果你想弄清楚为什么不应该传递给上下文的变量,那么你的视图中的调试位置。只需在视图返回之前将import pdb;pdb.set_trace()放到某处,然后四处寻找。