我的一个模板标签应该返回一个链接列表;大多数元素都是从数据库中获取的,除了一个,我会硬编码,因为它永远不会改变。
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áginaprincip'会导致以下错误:
/ teste / painel /
中的TemplateSyntaxError渲染时捕获异常:('ascii','P \ xc3 \ xa1gina principal',1,2,'ordinal not in range(128)')
如果我将字符串定义为unicode(u'Página...')它可以正常工作,但我不明白为什么。在我的代码顶部定义# - - coding:utf-8 - 后,django不应该知道如何使用它吗?
编辑: 如果我定义一个返回带有相同字符串的变量的简单标记('Páginaprincipal'),它可以正常工作。那么为什么这种情况不同会迫使我将字符串定义为unicode? p>
Edit2:FULL TAG
@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
答案 0 :(得分:1)
这是一个python的事情。普通字符串每字节存储1个字符。只需使用unicode版本。
编辑:
在Python 3中,普通字符串变为unicode。但是django尚未移植到3。
EDIT2:
只是为了获取文件开头的coding: utf-8
信息,只是告诉python解析器使用utf-8编码的源代码而不是默认的ASCII。它与字符串的内部表示无关。
答案 1 :(得分:0)
您应该使用Unicode string prefix:
u'Página principal'