Подтвердить что ты не робот

Ошибка django unicode на странице администратора

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

Пойманный 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 и подтвердил, что DB, таблица и столбец сопоставлены как 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 (который я не могу сделать в конечном итоге, так как я хочу, чтобы он редактировался в разделе admin), но я все равно получаю ту же ошибку, m даже не убедил, что xml - это даже проблема. Если xml не проблема, я понятия не имею, что еще может не отображать эту страницу.

class ProposalAdmin(admin.ModelAdmin):
    exclude = ('xml',)
admin.site.register(Project)
4b9b3361

Ответ 1

Там символ где-то, возможно, в 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

Ответ 2

2019 RIGHT SINGLE QUOTATION MARK, обычно используемый как фигурный апостроф.

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

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

Ответ 3

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

Это:

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

Должно быть

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

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