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