【问题标题】:String causes rendering exception with utf-8 defined定义了 utf-8 的字符串导致渲染异常
【发布时间】:2009-12-05 01:14:08
【问题描述】:

我的一个模板标签应该返回一个链接列表;大多数元素的名称都来自数据库,除了一个,我将对其进行硬编码,因为它永远不会改变。

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' 导致以下错误:

/teste/painel/ 处的模板语法错误

渲染时遇到异常:('ascii', 'P\xc3\xa1gina principal', 1, 2, 'ordinal not in range(128)')

如果我将字符串定义为 unicode(u'Página...') 它可以正常工作,但我不明白为什么。在我的代码顶部定义 # -- coding: utf-8 -- 之后,django 不应该知道如何使用它吗?

编辑: 如果我定义一个简单的标签,它返回一个具有相同字符串('Página principal')的变量,它工作正常。那么为什么这种情况不同,迫使我将字符串定义为 unicode?​​p>

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

【问题讨论】:

  • 请展示你如何定义标签。

标签: django unicode


【解决方案1】:

这是一个python的东西。普通字符串每字节存储 1 个字符。只需使用 unicode 版本即可。

编辑:

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

编辑2:

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

【讨论】:

  • 如果我定义一个简单的标签,它返回一个具有相同字符串的变量('Página principal'),它工作正常。那么为什么这种情况不同,迫使我将字符串定义为 unicode?​​span>
【解决方案2】:

你应该使用Unicode string prefix:

u'Página principal'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-05
    • 2018-06-29
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多