Функция direct_to_template
полезна, но
базовые представления Django показывают все свои возможности при
отображении информации из базы данных. Так как это является
частой задачей, Django поставляется с встроенными базовыми
представлениями, которые значительно упрощают генерацию списка
или страниц с детальной информацией.
Давайте взглянем на одно из этих базовых представлений:
представление «список объектов». Мы используем
объект Publisher
из главы «Модели»:
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()
class Meta:
ordering = ["-name"]
def __unicode__(self):
return self.name
Чтобы создать страницу со списком всех издателей[12] мы использовали такой файл со схемой URL:
from django.conf.urls.defaults import *
from django.views.generic import list_detail
from mysite.books.models import Publisher
publisher_info = {
"queryset" : Publisher.objects.all(),
}
urlpatterns = patterns('',
(r'^publishers/$', list_detail.object_list, publisher_info)
)
Это весь код на языке Python, который нам потребуется
написать. Однако, нам ещё надо создать шаблон. Мы можем явно
указать представлению object_list какой шаблон
надо использовать, добавив параметр
template_name
в словарь дополнительных
параметров. Но в случае отсутствия явного указания шаблона
Django будет искать шаблон, соответствующий имени объекта. В
этом случае, таким шаблоном будет
books/publisher_list.html
— часть
books идёт от имени приложения, которое
определяет модель, а publisher является именем
модели приведённым к нижнему регистру.
Этот шаблон будет обработан с учётом контекста, содержащего
переменную object_list
со списком всех
объектов Book
. Очень простой шаблон может
выглядеть так:
{% extends "base.html" %}
{% block content %}
<h2>Publishers</h2>
<ul>
{% for publisher in object_list %}
<li>{{ publisher.name }}</li>
{% endfor %}
</ul>
{% endblock %}
Вот всё что надо. Все преимущества базовых представления идут от изменения словаря с информацией, который передаётся такому представлению. Приложение «Справочник по базовым представлениям» документирует все базовые представления и все их параметры. Остальная часть главы описывает общие способы работы и настройки базовых представлений.
[12] В оригинальной книге, здесь они создают страницу со списком всех книг. Хотя, судя по коду, книги тут ни при чём.
Пред. | Уровень выше | След. |
Глава 9. Базовые представления | Начало | Расширение базовых представлений |
6 comments | Make a comment
Есть несколько вопросов:
Что такое "class Admin: pass"? Django на это ругается и этого нету в оригинальном источнике.
Опять же в оригинальном источнике описана функция "def __str__(self):", а здесь "def __unicode__(self):". Что правильно?
И при выполнении описанного кода Django выдет ошибку: TemplateDoesNotExist at /publishers/. Хотя publisher_list.html на месте. Что бы это могло значить?
Заранее спасибо
Обратите внимание на то, что эта глава не переведена для второй версии книги и тут может быть всякое.
Про __unicode__, так оно правильнее, если вы не семибитный житель США.
Раз Django выдаёт такую ошибку, значит так и есть. Вы подключили данный каталог с шаблонами в settings.py?
Ага, спасибо про def __str__(self): понятно
Да каталог шаблонов в settings.py прописан и другие шаблоны работают.
Просто интересно, не у кого не возникало данной ошибки именно в данной главе на версии 1.2?
сам только начал разбираться с django
версия 1.2.3
Exception Type: TemplateDoesNotExist
Exception Value: books/publisher_list.html
шаблон искался в том каталоге в котором описана модель
должно ли так быть, или это какой-то косяк не знаю
решил проблему добавив в publisher_info
template_name
в итоге получилось
publisher_info = {
"queryset": Publisher.objects.all(),
"template_name": "publisher_list.html",
}
http://docs.djangoproject.com/en/dev/ref/generic-views/
лучше постите такие вопросы на форум
django 1.3.1 зробив, як книжка пише) i все працює)