Хостинг Django от «Джино»
Table of contents

Добавляем строковое представление модели

Когда мы распечатали список издателей, всё что мы получили — бесполезный вывод, который затрудняет понимание:

[<Publisher: Publisher object>, <Publisher: Publisher object>]

Это можно легко исправить, добавив метод __unicode__() к нашему объекту Publisher. Метод __unicode__() указывает Python как отображать юникодное представление объекта. Вот так это используется в реальном приложении:

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

    def __unicode__(self):
        return self.name

class Author(models.Model):
    salutation = models.CharField(max_length=10)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()
    headshot = models.ImageField(upload_to='/tmp')

    def __unicode__(self):
        return '%s %s' % (self.first_name, self.last_name)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

    def __unicode__(self):
        return self.title

Как видно, метод __unicode__() может делать всё необходимое для того, чтобы возвратить строковое представление. В данном случае, методы __unicode__() для Publisher и Book просто возвращают имя объекта и заголовок, соответственно, но метод __unicode__() для Author более сложный — он объединяет поля first_name и last_name.

Единственное требование к методу __unicode__() — он должен возвращать объект Unicode. В противном случае, например, если метод возвращает целое число, Python вызовет исключение TypeError с сообщением «coercing to Unicode: need string or buffer, int found».

Объекты Unicode

Что представляют собой объекты Unicode?

Вы можете рассматривать объект Unicode в качестве обычной строки, которая может содержать миллион различных типов символов, от акцентированных версий латинских букв до различных символов экзотических языков.

Обычные строки в Python являются кодированными, это означает, что они используют кодировку: ASCII, ISO-8859-1 или UTF-8. Если вы помещаете в обычную строку экзотические символы (таковыми считаются любые символы, не попадающие в кодировку ASCII), вы должны помнить используемую кодировку, иначе на выходе вы получите непонятную мешанину символов. Проблемы возникают при попытках объединить данные в одной кодировке с данными в другой или при попытке отобразить эти данные в приложении, которое работает только с одной определённой кодировкой. Все мы встречались с сайтами или сообщениями электронной почты, которые содержали «??? ??????» или другие символы в нечётных позициях. Всё это показывает на проблему с кодировкой.

Однако объекты Unicode не имеют кодировки. Они используют целостный, универсальный набор символов, называемый «Unicode». При работе с объектами Unicode в Python, вы можете смешивать и сравнивать их, не беспокоясь о кодировке.

Django использует объекты Unicode везде. Объекты моделей выбираются в виде объектов Unicode, представления работают с Unicode данными, а шаблоны обрабатываются как Unicode. В общем, вам не надо беспокоиться о кодировках вообще. Всё должно работать.

Следует отметить то, что мы лишь кратко описали объекты Unicode. Вы можете самостоятельно продолжить их изучение. Хорошей точкой старта будет http://www.joelonsoftware.com/articles/Unicode.html.

Для того, чтобы эти изменения вступили в силу надо выйти из оболочки и запустить её снова командой python manage.py shell. (Это самый простой способ для активации изменений.) Теперь список объектов Publisher более понятен:

>>> from books.models import Publisher
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: Addison-Wesley>, <Publisher: O'Reilly>]

Удостоверьтесь, что каждая определённая вами модель имеет метод __unicode__(). Это необходимо не только для вашего удобства, но и потому что Django использует результат вызова этого метода при отображении объектов.

Наконец, следует отметить, что __unicode__() является хорошим примером добавления нового поведения моделям. Модель Django описывает большее чем просто таблицу для объекта, она также описывает всю функциональность этого объекта. Метод __unicode__() является одним из примеров такой функциональности — модель знает как отображать себя.

crapuchino 9 months, 2 weeks ago
Answer Link

да, это жизненная ситуация, если откуда то копируешь код, нужно проверить табуляция ли в нем или пробелы, я пока не сообразил (IDE подсказала рамочками) уже не знал что делать

sintsov.denis 9 months, 2 weeks ago
Answer Link

reply to sintsov.denis
Ничего не поменялось. Так же и выдает:
[<Publisher: Publisher object>, <Publisher: Publisher object>]

Версия django 1.3 (final), сервер Denwer + PythonAction 2.5 + PostgreSQL 8.4.2.

Проверил базу, там записи присутствуют. В чем дело, может библиотек каких-то нахватает?

P.S. Насчет записи в модели: headshot = models.ImageField(upload_to='/tmp'). При проверки на правильность синтаксиса модели (validate) выдает ошибку, что чего-то нахватает, дает ссылку и просит скачать. Пришлось просто задокументировать эту часть кода.

Разобрался. Оказывается была проблема в пробелах =). У кого IDE на кнопку Tab отступает на четыре пробела и он будет, как один исправьте это, а то возникнут проблемы.

В питоне блоки кода выделяются отступами, т.е. отступы это часть кода.

sintsov.denis 9 months, 2 weeks ago
Answer Link

Ничего не поменялось. Так же и выдает:
[<Publisher: Publisher object>, <Publisher: Publisher object>]

Версия django 1.3 (final), сервер Denwer + PythonAction 2.5 + PostgreSQL 8.4.2.

Проверил базу, там записи присутствуют. В чем дело, может библиотек каких-то нахватает?

P.S. Насчет записи в модели: headshot = models.ImageField(upload_to='/tmp'). При проверки на правильность синтаксиса модели (validate) выдает ошибку, что чего-то нахватает, дает ссылку и просит скачать. Пришлось просто задокументировать эту часть кода.


Ищем Python программистов

Found misprint?
Select it with the mouse and hit Enter
Ctrl-Enter
Processed:
33 1 199 25


The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!

We are glad to hear your questions, comments or suggestions!
(Open in new tab)

Users number: 601

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
ЯМ:41001223475816


© 2008-2012 Ruslan Popov @ gmail.com Powered by Django 1.2.5