我已经从迁移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'
工作正常。
我已经从迁移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'
工作正常。
查看回溯(如果包含在您的问题中会很有帮助),在 Django 的国际化/本地化代码中引发了异常。这是回溯的最后几行:
包装器中的文件“/home/mhawke/virtualenvs/django_1.8/lib/python2.7/site-packages/django/utils/lru_cache.py”,第 125 行 结果 = user_function(*args, **kwds) 文件“/home/mhawke/virtualenvs/django_1.8/lib/python2.7/site-packages/django/utils/translation/trans_real.py”,第 409 行,在 check_for_language 如果不是 language_code_re.search(lang_code): TypeError:预期的字符串或缓冲区
这对我来说似乎是一个错误,因为我发现它lang_code
是None
并且不被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))
如果您无法更改代码,您还可以通过更改模板以对变量使用escape
orsafe
过滤器来防止此错误:name
>>> 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'
但是当过滤器被应用于解决另一个问题时,这两种感觉都是错误的,它可能会掩盖这个问题,或者给未来的模板作者造成混淆。
>>> 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'}
从这里