Django Unicode ошибка на странице администратора - PullRequest
25 голосов
/ 03 июля 2011

Я смутно знаком с природой юникода, но я не уверен, как все части сочетаются друг с другом.У меня ошибка при отображении конкретных экземпляров на странице администратора.

Поймано UnicodeEncodeError при рендеринге: кодек 'ascii' не может кодировать символ u '\ u2019' в позиции 29: порядковый номер не в диапазоне (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 и проверил, что БД, таблица и столбец все сопоставлены как utf8_unicode_ci, поэтому я не понимаю, почему страница пытается отобразиться как ascii,Просматривая различные форумы и документы, я вижу упоминания функций str и unicode , но они, похоже, не имеют к этому никакого отношения, так как список экземпляров хорошо виденна странице администратора.Это просто показывает фактическую форму экземпляра, которая вызывает проблему.

Вот некоторый пример xml, который я извлек из phpmyadmin ...

<?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)

Ответы [ 3 ]

43 голосов
/ 03 июля 2011

Где-то есть символ , вероятно, в self.project.name. Возможно, вы найдете его, если проверите сообщение об ошибке целиком.

Однако, если вы получаете результаты Unicode из своей базы данных, возможно, будет разумнее сделать что-то вроде этого:

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

Самое умное , поскольку , рекомендованное документацией Django , заключается в реализации вместо него функции __unicode__:

def __unicode__(self):
    return u'Proposal for: %s' % self.project.name
8 голосов
/ 03 июля 2011

2019 - это ПРАВАЯ ОДНА ОДНА ЦИТАТА , обычно используемая как фигурный апостроф.

Возможно, проблема - , вызванная использованием __str__ вместо __unicode__ и В документации Django рекомендуется использовать только __unicode__.

Список экземпляров, вероятно, отображается нормально, так как не содержит поля, содержащего апостроф.

5 голосов
/ 13 июня 2014

(я бы добавил это как комментарий к Андре, но пока не набрал 50 баллов)

Это:

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

Должно быть

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

Это особенно верно, если вы используете в определении переменную, которая ссылается на другую модель, которая может возвращать строку с символами, которые не нравятся юникоду.Помещение «u» перед возвращаемым текстом гарантирует, что все будет кошерным и будет возвращено как Unicode.

...