Проблема с кодировкой в ​​шаблонах Django - PullRequest
5 голосов
/ 27 января 2009

У меня проблемы с использованием {% ifequal s1 "некоторый текст"%} для сравнения строк с расширенными символами в шаблонах Django. Когда строка s1 содержит символы ascii> 127, я получаю исключения при рендеринге шаблона. Что я делаю неправильно? Я использую кодировку UTF-8 во всей остальной части приложения в данных, шаблонах и коде Python без каких-либо проблем.

views.py

def test(request):
    return render_to_response("test.html", {
                                            "s1": "dados",
                                            "s2": "aprovação",
                                            }
                              )

test.html

s1={{s1}}<br>
s2={{s2}}<br>

{% ifequal s1 "dados" %}
  s1="dados" is true
{% endifequal %}

{% ifequal s1 "aprovação" %}
  s1="aprovação" is true
{% endifequal %}

{% comment %}
The following two comparions cause the following exception:
Caught an exception while rendering: 'ascii' codec can't decode byte 0xc3 in position 6: ordinal not in range(128)

{% ifequal s2 "dados" %}
  s2="dados" is true
{% endifequal %}

{% ifequal s2 "aprovação" %}
  s2="aprovação" is true
{% endifequal %}
{% endcomment %}

{% ifequal s2 u"dados" %}
  s2="dados" is true
{% endifequal %}

{% comment %}
The following comparison causes the following exception:
Caught an exception while rendering: 'ascii' codec can't encode characters in position 8-9: ordinal not in range(128)
{% ifequal s2 u"aprovação" %}
  s2="aprovação" is true
{% endifequal %}
{% endcomment %}

выход

s1=dados
s2=aprovação
s1="dados" is true 

1 Ответ

8 голосов
/ 27 января 2009

Иногда нет ничего лучше, чем описать проблему кому-то другому, чтобы помочь вам решить ее. :) Я должен был пометить строки Python как Unicode следующим образом, и теперь все работает:

def test(request):
    return render_to_response("test.html", {
                                            "s1": u"dados",
                                            "s2": u"aprovação",
                                            }
                              )
...