管理页面上的 django unicode 错误

Posted

技术标签:

【中文标题】管理页面上的 django unicode 错误【英文标题】:django unicode error on admin page 【发布时间】:2011-09-27 11:06:00 【问题描述】:

我对 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)

我已经进入我的 mysql 数据库并验证了 DB、表和列都被整理为 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>

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

class ProposalAdmin(admin.ModelAdmin):
    exclude = ('xml',)
admin.site.register(Project)

【问题讨论】:

【参考方案1】:

在某处有一个 字符,可能在self.project.name 中。如果您检查整个错误消息,您可能会找到它。

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

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

要做的最聪明的事情,因为它是recommended by the Django documentation,而是实现__unicode__函数:

def __unicode__(self):
    return u'Proposal for: %s' % self.project.name

【讨论】:

感谢 encode() 技巧 - ps:应该是 encode('ascii','replace') @Yuji Tomita,我想你可以双向称呼它。关键字参数和东西:docs.python.org/reference/expressions.html#calls @Yuji'Tomita'Tomita:docs.python.org/release/2.6/library/stdtypes.html#str.encode 那些文档对关键字参数只字未提。这是我在 2.6 中得到的:TypeError: encode() takes no keyword arguments。文档说在 2.7 中,添加了对关键字参数的支持。希望我能尽快完成 2.6,但它仍然被大量使用。 是的,你完全正确。我的错!感谢您指出。【参考方案2】:

2019 是RIGHT SINGLE QUOTATION MARK,通常用作弯撇号。

问题可能你使用__str__而不是__unicode__引起的,Django's documentation建议你只使用__unicode__

实例列表可能显示得很好,因为它不包括包含撇号的字段。

【讨论】:

__unicode__ 推荐投票十亿次!我花了大约 3 个小时来查看我在管理详细信息视图中出现错误的原因。 unicode 覆盖为我修复了它。【参考方案3】:

(我会将此作为评论添加到 Andre's 但还没有 50 分)

这个:

def __unicode__(self):
    return 'Proposal for: %s' % self.project.name

应该是

def __unicode__(self):
    return u'Proposal for: %s' % self.project.name

如果您在定义中使用的变量引用了另一个模型,该变量可能返回带有 unicode 不喜欢的字符的字符串,则尤其如此。在返回的文本前面加上“u”,确保所有内容都符合犹太教规并以 unicode 形式返回。

【讨论】:

以上是关于管理页面上的 django unicode 错误的主要内容,如果未能解决你的问题,请参考以下文章

django:使用没有 unicode 'u' 类型指示符的安全过滤器渲染变量

django admin中文输入编码错误

django上的管理页面已损坏

Python:可以转储数据无法加载数据。 Unicode解码错误

Django,在保存期间自动设置字段,基于其他管理页面输入

在 django 管理更改列表页面上的每条记录上添加按钮?