1

我已经从迁移Django 1.6Django 1.8. 这在中工作正常,Django 1.6expected string or bufferDjango 1.8.

这是我的代码:

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

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

4

2 回答 2

2

查看回溯(如果包含在您的问题中会很有帮助),在 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_codeNone并且不被re.search(). 或者这可能是我的配置问题。

use_l10n=False您可以通过像这样传递给上下文来显式禁用本地化Context

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

因此,只要您可以传递use_l10nContext,您就有一个解决方法,尽管您可能无法更改代码,否则您可以使用以下内容修复字典:

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

如果您无法更改代码,您还可以通过更改模板以对变量使用escapeorsafe过滤器来防止此错误: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'

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

于 2015-04-23T12:11:12.137 回答
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'}

这里

于 2015-04-23T11:50:01.167 回答