Строка вызывает исключение рендеринга с определенным utf-8 - PullRequest
0 голосов
/ 05 декабря 2009

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

lista_menu = '<ul class="menu">\n\
<li><a href="' + reverse('profileloja', args=(s_loja,)) + '">' + \
loja.nome.title() + '</a></li>\n<li><a href="' + reverse('index', args=(s_loja,)) + \
'">' + 'Página principal' + '</a></li>\n'

Строка 'Página Principal' вызывает следующую ошибку:

TemplateSyntaxError в / teste / painel /

Выявлено исключение при рендеринге: ('ascii', 'P \ xc3 \ xa1gina принципал', 1, 2, 'порядковый номер не в диапазоне (128)')

Если я определяю строку как юникод (u'Página ... '), она работает нормально, но я не понимаю, почему. Разве Джанго не должен знать, как с этим работать после того, как я определю # - - кодирование: utf-8 - - в верхней части моего кода?

Edit: если я определю простой тег, который возвращает переменную с той же строкой («Принцип Página»), он будет работать нормально. Так почему же этот случай отличается, что заставляет меня определять строку как Unicode?

Edit2: полная метка

@register.simple_tag
def menupainel(s_loja):
    def listapaginas(paginfo_menu):
        lista_menu = ''
        for pagina in paginfo_menu:
            lista_menu += '<li><a href="' + \
                reverse('painel_paginfo', args=(pagina.loja, pagina.id))+ \
                '">' + pagina.titulo.title() + '</a></li>\n'
            lista_menu += '<li class="opcoes_objecto"><a href="' + \
                          reverse('editpaginfo', args=(pagina.loja, pagina.id)) + \
                          '">' + pagina.titulo.title() + '</a></li>\n'
            lista_menu += '<li class="opcoes_objecto"><a href="' + \
                          reverse('delpaginfo', args=(pagina.loja, pagina.id)) + \
                          '">' + pagina.titulo.title() +'</a></li>\n'
            return lista_menu
    loja = get_object_or_404(Loja, slug=s_loja)  
    menus = loja.menus.all()
    paginfo_sem_menu = PaginaInfo.objects.filter(loja=loja).\
                       filter(publico=True).filter(menu=None)
    lista_menu = '<ul class="menu">\n\
<li><a href="' + reverse('profileloja', args=(s_loja,)) + '">' + \
loja.nome.title() + '</a></li>\n<li><a href="' + reverse('index', args=(s_loja,)) + \
'">' + u'Página principal' + '</a></li>\n'      
    for menu in menus:
        paginfo_menu = menu.paginasinfo.exclude(slug='index')
        if paginfo_menu:
            lista_menu += '<li id="titulo">' + \
                          menu.nome.title() + '</li>\n' + \
                          listapaginas(paginfo_menu)
    if paginfo_sem_menu:
        lista_menu += listapaginas(paginfo_sem_menu)
    lista_menu += '</ul>'
    return lista_menu

Ответы [ 2 ]

1 голос
/ 05 декабря 2009

Это вещь на питоне. Обычные строки хранят 1 символ на байт. Просто используйте версию Unicode.

Edit:

В Python 3 обычные строки стали юникодом. Но django еще не портировано на 3.

Edit2:

Просто для информации coding: utf-8 в начале файла просто говорит парсеру python работать с кодированным исходным кодом utf-8 вместо ASCII по умолчанию. Это не имеет ничего общего с внутренним представлением строк.

0 голосов
/ 05 декабря 2009

Вы должны использовать Строковый префикс Unicode :

u'Página principal'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...