Шаблон (".."). Render() в 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 ответа

Решение

Если посмотреть на трассировку (которая была бы полезна, если бы она была включена в ваш вопрос), исключение возникает в коде интернационализации / локализации Django. Вот последние несколько строк трассировки:

  Файл "/home/mhawke/virtualenvs/django_1.8/lib/python2.7/site-packages/django/utils/lru_cache.py", строка 125, в оболочке
    result = 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):
Ошибка типа: ожидаемая строка или буфер

Это похоже на ошибку для меня, когда я обнаружил, что 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'

Но оба из них кажутся неправильными, поскольку фильтр применяется для обхода другой проблемы, и он может маскировать эту проблему или вызывать путаницу у будущих авторов шаблонов.

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

Отсюда

Другие вопросы по тегам