Главная | Архив новостей | Общение | Площадка | Примеры OpenID
Хостинг Django от «Джино»
Оглавление

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

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

[<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__() является одним из примеров такой функциональности — модель знает как отображать себя.


Увидели ошибку?
Выделите её мышкой и нажмите
Ctrl-Enter
Обработано:
1049 49 130 71

Версия книги
1.0 2.0
Версия 2.0 в процессе перевода!

Мой луч
Многообразие света

Полезное
Актуальные вакансии, Python работа для python-разработчиков.


Скачать в формате
CHM от 2 сентября

Заказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта.
Чем чаще заказываете — тем больше перевожу.

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

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
R130494980980
Z425285133788
E112528079659
U327380922061

Книга помогла реализовать:
Проект «Мой луч»
АРМ УФМС.


Мой вебсайт стоит666 337,31 руб

© 2008-2009 Ruslan Popov @ gmail.com Powered by Django 1.1 beta 1 SVN-11114
Главная | Архив новостей | Общение | Площадка | Примеры OpenID