管理页面上的django unicode错误

voo*_*ant 25 django unicode django-admin

我模糊地熟悉unicode的本质,但我不确定所有部分是如何组合在一起的.在管理页面中显示特定实例时出错.

渲染时捕获UnicodeEncodeError:'ascii'编解码器无法编码位置29中的字符u'\ u2019':序数不在范围内(128)

这是我的模特:

class Proposal(models.Model):
    project = models.ForeignKey(Project)
    dateCreated = models.DateTimeField(editable=False)
    xml = models.TextField(max_length=1000000)

    def __str__(self):
        return str('Proposal for: %s' % self.project.name)
Run Code Online (Sandbox Code Playgroud)

我已经进入我的mysql数据库并验证了数据库,表和列都被整理为utf8_unicode_ci,所以我不明白为什么页面试图呈现为ascii.查看各种论坛和文档,我看到了strunicode函数的提及,但它们似乎与此无关,因为实例列表在管理页面上显示正常.它只是显示导致问题的实际实例表单.

这是我从phpmyadmin中提取的一些xml示例...

<?xml version="1.0"  encoding="UTF-8"?>
<proposal>

  <section title="OVERVIEW">
    <section title="Introduction">
      <text>
    This proposal is not in the system because it was completed as an agreement in Word previous to us getting this application up and running.  Please refer to the attachments in this project for documentation or to see the agreement.
      </text>
    </section>
  </section>
</proposal>
Run Code Online (Sandbox Code Playgroud)

我甚至试图故意排除xml(从长远来看我无法做到,因为我希望它在管理部分可以编辑),但我仍然得到同样的错误,所以我甚至都没有确信xml甚至是问题所在.如果xml不是问题,我不知道还有什么可以阻止显示这个页面.

class ProposalAdmin(admin.ModelAdmin):
    exclude = ('xml',)
admin.site.register(Project)
Run Code Online (Sandbox Code Playgroud)

And*_*zlo 43

某个地方有一个角色,可能在self.project.name.如果您检查整个错误消息,您可能会找到它.

但是,如果您从数据库获得unicode结果,那么执行以下操作可能会更聪明:

def __str__(self):
    return ('Proposal for: %s' % self.project.name).encode('ascii', errors='replace')
Run Code Online (Sandbox Code Playgroud)

最聪明的事情,因为它是由Django的文档建议,是落实__unicode__函数:

def __unicode__(self):
    return u'Proposal for: %s' % self.project.name
Run Code Online (Sandbox Code Playgroud)

  • `encode()`不带关键字参数 - 至少在2.6上 (2认同)
  • 那些文档没有提到关键字参数.这是我在2.6中得到的:`TypeError:encode()不带关键字参数`.Docs在2.7中说,增加了对关键字参数的支持.希望我可以尽快完成2.6但它仍然大量使用. (2认同)

Jim*_*Jim 8

2019年是正确的单引号,通常用作卷曲撇号.

问题可能由于您使用__str__而不是__unicode__,而Django的文档建议您仅使用__unicode__.

实例列表可能显示正常,因为它不包含包含撇号的字段.


小智 5

(我将此作为评论添加到安德烈的,但还没有得到50分)

这个:

def __unicode__(self):
    return 'Proposal for: %s' % self.project.name
Run Code Online (Sandbox Code Playgroud)

应该

def __unicode__(self):
    return u'Proposal for: %s' % self.project.name
Run Code Online (Sandbox Code Playgroud)

如果您在定义中使用一个变量引用另一个可能返回字符串unicode不喜欢的字符串的变量,则尤其如此.在返回的文本前放入"u"可确保所有内容都是犹太符并以unicode形式返回.