我已从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'
可以正常工作。
答案 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_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
变量上的safe
或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'
但是这些都感觉不对,因为过滤器正在应用于解决另一个问题,它可能会掩盖这个问题,或者导致对未来模板作者的混淆。
答案 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