Когда мы распечатали список издателей, всё что мы получили — бесполезный вывод, который затрудняет понимание:
[<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__() является одним из примеров такой функциональности — модель знает как отображать себя.
| Пред. | Уровень выше | След. |
| Доступ к данным | Начало | Вставка и изменение данных |
7 комментариев | Оставьте комментарий
Ничего не поменялось. Так же и выдает:
[<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) выдает ошибку, что чего-то нахватает, дает ссылку и просит скачать. Пришлось просто задокументировать эту часть кода.
Ответ на 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 отступает на четыре пробела и он будет, как один исправьте это, а то возникнут проблемы.
В питоне блоки кода выделяются отступами, т.е. отступы это часть кода.
да, это жизненная ситуация, если откуда то копируешь код, нужно проверить табуляция ли в нем или пробелы, я пока не сообразил (IDE подсказала рамочками) уже не знал что делать
Ответ на crapuchino
да, это жизненная ситуация, если откуда то копируешь код, нужно проверить табуляция ли в нем или пробелы, я пока не сообразил (IDE подсказала рамочками) уже не знал что делать
Не надо ничего копировать. Вы же учитесь: напишите всё ручками - намного больше пользы будет.
надо еще добавить
from django.db import utils
а то __unicode__ не очень пашет..
Ответ на 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) выдает ошибку, что чего-то нахватает, дает ссылку и просит скачать. Пришлось просто задокументировать эту часть кода.
на одном из форумов увидел, "В python 3+ вместо __unicode__ используется __str__." мне помогло.
Ответ на vipi
на одном из форумов увидел, "В python 3+ вместо __unicode__ используется __str__." мне помогло.
Спасибо. Для третьего питона заработало так:
def __str__(self):
return self.name