Dav*_*ver 19 django django-templates
我怎么能让Django在遇到它时告诉我,例如,在渲染模板时出现未定义的变量错误?
我已经尝试了明显的DEBUG = True和TEMPLATE_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'使无效变量呈现为其变量名,这样,您就可以轻松识别. 如何-无效的变量,是长柄
似乎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。
查找上下文中不存在的模板变量对我来说很重要,因为有几次错误使其进入生产环境,因为视图已更改但模板未更改。
我使用了在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)
| 归档时间: |
|
| 查看次数: |
6416 次 |
| 最近记录: |