在django admin中保存对象时出现unicode错误

时间:2010-01-06 08:12:52

标签: python django unicode django-admin

在我的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使用其他东西并安全地检索对象?

4 个答案:

答案 0 :(得分:6)

我很确定您的数据库可能正在使用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

上修复的错误

答案 1 :(得分: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 和......这在提供的链接中提到了!

答案 2 :(得分:1)

在您的模型中,您是否尝试过

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

不确定这是否是您正在搜索的答案,但是您尝试了吗?

答案 3 :(得分:0)

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

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