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

Базовые представления объектов

Функция 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"]

    class Admin:
        pass

    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] В оригинальной книге, здесь они создают страницу со списком всех книг. Хотя, судя по коду, книги тут ни при чём.

Nelly_lucky 1 month, 2 weeks ago
Answer Link

django 1.3.1 зробив, як книжка пише) i все працює)

alerion 1 year, 2 months ago
Answer Link

лучше постите такие вопросы на форум

dmitriyff 1 year, 2 months ago
Answer Link

сам только начал разбираться с 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/

gleb.svechnikov@gmail.com 1 year, 2 months ago
Answer Link

Ага, спасибо про def __str__(self): понятно
Да каталог шаблонов в settings.py прописан и другие шаблоны работают.
Просто интересно, не у кого не возникало данной ошибки именно в данной главе на версии 1.2?

rad 1 year, 2 months ago
Answer Link

Обратите внимание на то, что эта глава не переведена для второй версии книги и тут может быть всякое.

Про __unicode__, так оно правильнее, если вы не семибитный житель США.

Раз Django выдаёт такую ошибку, значит так и есть. Вы подключили данный каталог с шаблонами в settings.py?

gleb.svechnikov@gmail.com 1 year, 2 months ago
Answer Link

Есть несколько вопросов:
Что такое "class Admin: pass"? Django на это ругается и этого нету в оригинальном источнике.

Опять же в оригинальном источнике описана функция "def __str__(self):", а здесь "def __unicode__(self):". Что правильно?

И при выполнении описанного кода Django выдет ошибку: TemplateDoesNotExist at /publishers/. Хотя publisher_list.html на месте. Что бы это могло значить?
Заранее спасибо


Ищем 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