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='
    \n\
  • \n
  • \n'
字符串“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='
      \n\
    • \n
    • \n' 对于菜单中的菜单: paginfo\u menu=menu.paginasinfo.exclude(slug='index') 如果paginfo_菜单: 列表菜单+='
    • '+\ menu.nome.title()+'
    • \n'+\ listapaginas(paginfo_菜单) 如果paginfo\u sem\u菜单: lista_菜单+=listapaginas(paginfo_sem_菜单) 列表菜单+='
    ' 返回列表菜单
    这是一个python的东西。普通字符串每字节存储1个字符。只需使用unicode版本

    编辑:

    在Python3中,普通字符串变成了unicode。但是django还没有移植到3

    编辑2:

    仅供参考,文件开头的
    coding:utf-8
    告诉python解析器使用utf-8编码的源代码,而不是默认的ASCII。它与字符串的内部表示无关。

    您应该使用:


    如果我定义了一个简单的标记,返回一个具有相同字符串的变量('Página principal'),它就可以正常工作。那么,为什么这种情况不同,迫使我将字符串定义为unicode?请说明如何定义标记。
    u'Página principal'