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