Django 1.8 中的 Template("..").render() 不允许数值

Template("..").render() in Django 1.8 not allowing numeric values

我已经从 Django 1.6 迁移到 Django 1.8。这在 Django 1.6 中工作正常,但在 Django 1.8 中给了我 expected string or buffer 异常。

这是我的代码:

html = Template('hi {{name}}').render(Context({'name': 12}))

这里的问题是'name':12。将其更改为 'name':'12' 效果很好。

>>> c = Context()
>>> c['foo'] = 'first level'
>>> c.update({'bar': 'second level'})
{'bar': 'second level'}
>>> c.flatten()
{'True': True, 'None': None, 'foo': 'first level', 'False': False, 'bar': 'second level'}

来自here

查看回溯(如果包含在您的问题中会有所帮助),异常是在 Django 的 internationalisation/localisation 代码中引发的。这是回溯的最后几行:

  File "/home/mhawke/virtualenvs/django_1.8/lib/python2.7/site-packages/django/utils/lru_cache.py", line 125, in wrapper
    result = user_function(*args, **kwds)
  File "/home/mhawke/virtualenvs/django_1.8/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 409, in check_for_language
    if not language_code_re.search(lang_code):
TypeError: expected string or buffer

我发现 lang_codeNone 并且不被 re.search() 接受,这对我来说像是一个错误。或者这可能是我的配置问题。

您可以通过将 use_l10n=False 传递给 Context 来在上下文中明确禁用本地化,如下所示:

>>> html = Template('hi {{name}}').render(Context({'name': 12}, use_l10n=False))
>>> html
u'hi 12'

因此,只要您可以将 use_l10n 传递给 Context,您就有了一个解决方法,尽管您可能无法更改代码,否则您可以使用如下方式修复字典:

d = {k: str(v) for k,v in {'name': 12}.items()}
html = Template('hi {{name}}').render(Context(d))

如果您无法更改代码,也可以通过更改模板以在 name 变量上使用 escapesafe 过滤器来防止此错误:

>>> html = Template('hi {{name|escape}}').render(Context({'name': 12}))
>>> html
u'hi 12'

或者您可以使用 safe(如果您知道值 安全的):

>>> html = Template('hi {{name|safe}}').render(Context({'name': 12}))
>>> html
u'hi 12'

但是当应用过滤器来解决另一个问题时,这两种感觉都不对,它可能会掩盖那个问题,或者给未来的模板作者造成混淆。