Символы Django, отличные от ASCII, в значениях тегов шаблона

Я пишу пользовательский тег шаблона Django для французского приложения. Мой тег шаблона принимает параметр, который представляет собой строку:

{% mytag "Hello" %}

Работает идеально, но терпит неудачу при попытке поместить в значение некоторые символы, отличные от ASCII.

Как бы вы заставили эту штуку работать:

{% mytag "Êtes-vous à Paris ?" %}

Я получил эту ошибку:

Кодек 'ascii' не может кодировать символ u'\xca' в позиции 0: порядковый номер не в диапазоне (128)

Подсказка об ошибке Юникода

Строка, которую не удалось закодировать/декодировать: Êtes-v

Большое спасибо заранее!

РЕДАКТИРОВАТЬ: версия Python - 2.7. Вот код тега:

@register.simple_tag(takes_context=True)
def mytag(context, my_var):
    return "Here it is: {my_var}".format(my_var=my_var)

person user650108    schedule 29.05.2015    source источник
comment
Какая версия питона? Можете ли вы показать нам код для тега?   -  person Wtower    schedule 29.05.2015
comment
Посмотрите, поможет ли это stackoverflow.com/a/13986802/2445183.   -  person itzhaki    schedule 29.05.2015
comment
Версия Python 2.7. Добавил код тега в начальный пост. Спасибо за помощь…   -  person user650108    schedule 29.05.2015
comment
Уже добавлено # -- coding: utf-8 -- в файл объявления тегов. Просто кажется, что Django не позволяет передавать специальные символы в теге :(   -  person user650108    schedule 29.05.2015
comment
@danihp, пожалуйста, не рекомендуйте это случайно. Заголовки кодирования предназначены для литералов в исходном коде и не имеют ничего общего с этой проблемой.   -  person Daniel Roseman    schedule 29.05.2015
comment
@ user650108 вы можете быть уверены, что это не так. Django полностью интернационализирован, и его основные разработчики со всего мира, включая страны с полностью нелатинскими наборами символов.   -  person Daniel Roseman    schedule 29.05.2015


Ответы (1)


Попробуйте заменить

return "Here it is: {my_var}".format(my_var=my_var)

by

return u"Here it is: {my_var}".format(my_var=my_var)

В Python 2.7 "Here it is: {my_var}" — это объект str, закодированная строка, my_var — это объект unicode, декодированная строка, при форматировании Python попытается закодировать my_var, чтобы он соответствовал типу строки форматирования. Для этого используется кодек ascii по умолчанию, который не поддерживает специальные символы.

Добавление u перед строкой форматирования превращает ее в строку unicode, во время форматирования кодирование выполняться не будет.

Поскольку похоже, что вы говорите по-французски, советую прочитать эту статью, которая является отличным руководством по кодированию в Python.

person aumo    schedule 29.05.2015