Django 字符串导致已定义utf-8的呈现异常
我的一个模板标签应该返回链接列表;大多数元素的名称都是从数据库中获取的,只有一个例外,我将对其进行硬编码,因为它永远不会更改Django 字符串导致已定义utf-8的呈现异常,django,unicode,Django,Unicode,我的一个模板标签应该返回链接列表;大多数元素的名称都是从数据库中获取的,只有一个例外,我将对其进行硬编码,因为它永远不会更改 lista_menu = '<ul class="menu">\n\ <li><a href="' + reverse('profileloja', args=(s_loja,)) + '">' + \ loja.nome.title() + '</a></li>\n<li><a href="'
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'
lista\u menu='
字符串“página principal”导致以下错误:
模板语法错误位于/teste/painel/
呈现时捕获到异常:('ascii','p\xc3\xa1gina principal',1,2',序号不在范围(128)'
如果我将字符串定义为unicode(u'página…'),它可以正常工作,但我不明白为什么。在我在代码顶部定义了#——编码:utf-8——之后,django难道不应该知道如何使用它吗
编辑:
如果我定义了一个简单的标记,返回一个具有相同字符串的变量('Página principal'),它就可以正常工作。那么,为什么这种情况不同,迫使我将字符串定义为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
@register.simple\u标签
def menupainel(s_loja):
def listapaginas(页面信息菜单):
列表菜单=“”
对于pagina,在paginfo_菜单中:
列表菜单+='\n'
列表菜单+='\n
列表菜单+='\n
返回列表菜单
loja=获取对象或404(loja,slug=s\u-loja)
menus=loja.menus.all()
paginfo\u sem\u menu=PaginaInfo.objects.filter(loja=loja)\
过滤器(publico=True)。过滤器(菜单=None)
lista_menu='
'
返回列表菜单
这是一个python的东西。普通字符串每字节存储1个字符。只需使用unicode版本
编辑:
在Python3中,普通字符串变成了unicode。但是django还没有移植到3
编辑2:
仅供参考,文件开头的coding:utf-8
告诉python解析器使用utf-8编码的源代码,而不是默认的ASCII。它与字符串的内部表示无关。您应该使用:
如果我定义了一个简单的标记,返回一个具有相同字符串的变量('Página principal'),它就可以正常工作。那么,为什么这种情况不同,迫使我将字符串定义为unicode?请说明如何定义标记。
u'Página principal'