Шаблон (".."). 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'}