Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
355 views
in Technique[技术] by (71.8m points)

python - unicode error when saving an object in django admin

In my django app, I have some objects that cause the corresponding URL in the django admin to be non ascii. (for example: http://mysite/admin/myapp/myclass/Présentation/)

I can edit the object without any problem but when I save it I have the following error:

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

The strange thing is that the object is correctly saved into the database.

Does anybody know how the Django admin manages unicode? Any info, pointer or idea that can help to fix this problem would be appreciated.

Thanks in advance

Update: Here is the code of the Model

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)

Update: That's clear that non-ascii character are not recommended in an URL. That's the cause of my problem and I have changed that.

Does anybody know what is used by the Django admin to build the URL of an object. I guess that it is the primary key. Is it right? is there a way to force Django to use something else and to retrieve the object safely?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I'm pretty sure your database is probably using the latin1 encoding. Django supposes you have everything set as unicode (utf8).

To check this out, get into MySQL Shell and type:

mysql> show variables like 'char%';

If you see a bunch of latin1 (or any other encoding that isn't utf8, except binary), you'll have to do this: Open up my.cnf and look for the [mysqld] section. Make sure after tmpdir = /tmp, you have the following lines:

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

Restart the server.

You'll have to recreate or manually edit the encoding of all databases and table you have, changing my.cnf only affects the databases that will be created.

Hope I've helped.

Edit: By the way, on which Django version are you on? Seems like this was a bug that was fixed on 1.1: http://code.djangoproject.com/ticket/10267


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...