【问题标题】:unicode error when saving an object in django admin在 django admin 中保存对象时出现 unicode 错误
【发布时间】:2010-01-06 08:12:51
【问题描述】:

在我的 django 应用程序中,我有一些对象导致 django admin 中的相应 URL 不是 ascii。 (例如:http://mysite/admin/myapp/myclass/Présentation/

我可以毫无问题地编辑对象,但是当我保存它时出现以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 24: ordinal not in range(128), HTTP response headers must be in US-ASCII format

奇怪的是对象被正确保存到数据库中。

有人知道 Django 管理员是如何管理 unicode 的吗?任何可以帮助解决此问题的信息、指针或想法将不胜感激。

提前致谢

更新:这是模型的代码

class Plugin(models.Model):
    """Some subcontent that can be added to a given page"""
    class Meta:
        ordering = ['ordering']

    name = models.CharField(max_length=32, primary_key=True)
    div_id = models.CharField(default='rightcol', max_length=32)
    published = models.BooleanField(default=True,
        help_text=_("If this is not checked, it is not displayed on the page."))
    ordering = models.IntegerField(default=1,
        help_text=_("plugins are sorted with this number in ascending order"))
    content = models.TextField(blank=True)
    registration_required = models.BooleanField(_('registration required'),
        help_text=_("If this is checked, only logged-in users will be able to view the page."))

    def __unicode__(self):
        return u"%s -- %s" % (self.name, self.div_id)

更新: 很明显,不建议在 URL 中使用非 ascii 字符。这就是我的问题的原因,我已经改变了它。

有人知道 Django 管理员使用什么来构建对象的 URL。我猜它是主键。这样对吗?有没有办法强制 Django 使用其他东西并安全地检索对象?

【问题讨论】:

  • 你能发布你的演示模型的colde吗?

标签: python django unicode django-admin


【解决方案1】:

我很确定您的数据库可能使用的是 latin1 编码。 Django 假设您将所有内容都设置为 unicode (utf8)。

要检查这个,进入 MySQL Shell 并输入:

mysql> show variables like 'char%';

如果您看到一堆 latin1(或任何其他不是 utf8 的编码,二进制除外),您必须这样做: 打开 my.cnf 并查找 [mysqld] 部分。 确保在tmpdir = /tmp 之后,您有以下几行:

default-character-set=utf8
collation_server=utf8_unicode_ci
character_set_server=utf8
skip-external-locking
skip-character-set-client-handshake

重启服务器。

您必须重新创建或手动编辑您拥有的所有数据库和表的编码,更改 my.cnf 只会影响将要创建的数据库。

希望我有所帮助。

编辑:顺便问一下,您使用的是哪个 Django 版本?似乎这是在 1.1 上修复的错误:http://code.djangoproject.com/ticket/10267

【讨论】:

  • 我将与我的主机提供商核实。我有 | character_set_client |拉丁语1 | |字符集连接 |拉丁语1 | |字符集数据库 | utf8 | |字符集文件系统 |二进制 | |字符集结果 |拉丁语1 | | character_set_server |拉丁语1 |
  • 如果他们不更改它,您可以重新创建数据库,将所有内容设置为 utf8
  • 根据我的主机提供商,这个pb与db编码无关。我认为他是对的,因为这个 pb 是零星的。感谢您的帮助
  • 我认为这与数据库无关。数据已正确保存。问题来自 URL 中的法语字母。 django 代码的某些部分似乎接受它,而另一些则不接受
  • 你检查过这个链接吗? code.djangoproject.com/ticket/10267 Django 1.1 好像修复了一个bug,你是哪个版本的?
【解决方案2】:

This link 拯救了我的一天
您必须在 models.py 中为您的管理员添加 unicode 支持:

class MyModel (models.Model):
    some_field = models.CharField(max_length=1000)
    def __unicode__(self):
        return u'%s'%(self.some_field)

可能还有其他问题,例如:您的系统编码不是 utf8您的数据库编码不是 utf8 和...在提供的链接中提到!

【讨论】:

    【解决方案3】:

    在你的模型中,你试过放

    class Model(models.Model):
       def __unicode__(self):
           return self.name ## having a model object named "name"
    

    不确定这是否是您正在寻找的答案,但您尝试过吗?

    【讨论】:

    • 我的模型有一个 unicode。 Django 不使用 unicode 来构建 url。我认为它将无法安全地检索对象。我猜它使用主键。感谢您的帮助
    【解决方案4】:

    我现在使用默认 id 作为模型每个类的主键。因此,从管理站点访问对象时,我的 url 中没有禁止字符。

    我建议在大多数情况下保留默认 id 作为主键

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 2011-03-18
      • 2018-12-04
      • 2021-03-09
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      相关资源
      最近更新 更多