ошибка юникода при сохранении объекта в админке django - PullRequest
3 голосов
/ 06 января 2010

В моем приложении django есть некоторые объекты, которые приводят к тому, что соответствующий URL-адрес в администраторе django не является 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 управляет юникодом? Буду признателен за любую информацию, указатель или идею, которые могут помочь решить эту проблему.

Заранее спасибо

Обновление: вот код модели

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)

Обновление: Понятно, что не-ascii символы не рекомендуются в URL. Это причина моей проблемы, и я изменил это.

Кто-нибудь знает, что используется администратором Django для создания URL-адреса объекта. Я думаю, что это первичный ключ. Это правильно? Есть ли способ заставить Django использовать что-то еще и безопасно получить объект?

Ответы [ 4 ]

6 голосов
/ 06 января 2010

Я уверен, что ваша база данных, вероятно, использует кодировку latin1. Джанго предполагает, что у вас все настроено как юникод (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

2 голосов
/ 04 декабря 2015

Эта ссылка спасла мой день
Вы должны добавить поддержку юникода для вашего администратора в вашем models.py :

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

могут быть и другие проблемы, такие как: кодировка вашей системы не utf8 , кодировка вашей базы данных не utf8 и ... которая упоминается в указанной ссылке! *

1 голос
/ 06 января 2010

в вашей модели, вы пытались поставить

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

Не уверен, что это ответ, который вы ищете, но вы пробовали?

0 голосов
/ 21 января 2010

Я сейчас использую идентификатор по умолчанию в качестве первичного ключа для каждого класса моей модели. Как следствие, у меня нет запрещенных символов в URL при доступе к объектам с сайта администратора.

Я рекомендую оставить идентификатор по умолчанию в качестве первичного ключа в большинстве случаев

...