Django 1.8中的模板(“..”)。render()不允许使用数值

时间:2015-04-23 11:27:35

标签: python django-1.8

我已从Django 1.6迁移到Django 1.8。这在Django 1.6中运行良好,但在expected string or buffer中给我Django 1.8例外。

这是我的代码:

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

这里的问题是'name':12。将其更改为'name':'12'可以正常工作。

2 个答案:

答案 0 :(得分:2)

查看回溯(如果包含在您的问题中会很有帮助),Django的国际化/本地化代码中会引发异常。以下是追溯的最后几行:

  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_codeNonere.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))

如果您无法更改代码,也可以通过更改模板以使用escape变量上的safename过滤器来阻止此错误:

>>> 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'

但是这些都感觉不对,因为过滤器正在应用于解决另一个问题,它可能会掩盖这个问题,或者导致对未来模板作者的混淆。

答案 1 :(得分:0)

>>> 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