Использование базовых классов представлений(class-based views)
Поскольку представление является вызовом, который принимает веб-запрос и возвращает веб-ответ, можно также определить представления как методы класса. Джанго предоставляет базовые классы представления для этого. Все они наследуются от класса View, который обрабатывает отправку метода HTTP и другие функциональные возможности. Это альтернативный метод создания представлений.
Мы собираемся изменить наш post_list view на view базовых классов(class-based), чтобы использовать универсальный ListView, предложенный Джанго. Этот базовый вид позволяет перечислить объекты любого типа.
Отредактируйте файл views.py вашего блога:
from django.views.generic import ListView
class PostListView(ListView):
queryset = Post.published.all()
context_object_name = 'posts'
paginate_by = 3
template_name = 'blog/post/list.html'
Это представление аналагочно представлению post_list. Поговорим о том, что мы написали в ListView:
- Используем определенный запрос вместо извлечения всех объектов. Вместо определения атрибута запроса мы могли бы иметь указанную model = Post и Джанго построил бы для нас универсальный Post.objects.all().
- Используем учетные записи переменных контекста для результатов запроса. Переменная по умолчанию — object_list, если мы не указываем ни одного context_object_name.
- Пагинация результатов, отображающих три объекта на страницу.
- Используем пользовательский шаблон для визуализации страницы. Если не задать шаблон по умолчанию, ListView будет использовать blog/post_list.html.
Теперь давайте отредактируем файл urls.py вашего блога, закомментируем URL паттерн post_list и добавим новый паттерн PostListView:
urlpatterns = [
# post views
# url(r'^$', views.post_list, name='post_list'),
url(r'^$', views.PostListView.as_view(), name='post_list'),
url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/'\
r'(?P<post>[-\w]+)/$',
views.post_detail,
name='post_detail'),
]
Чтобы сохранить работу пагинации, необходимо использовать объект right page(не знаю как правильно перевести), передаваемый в шаблон. Элемент управления Джанго передает выбранную страницу в переменной с именем page_obj, поэтому необходимо отредактировать шаблон post_list.html, чтобы включить пагинатор, используя правильную переменную:
{% include "pagination.html" with page=page_obj %}
Откройте http://127.0.0.1:8000/blog/ в браузере и убедитесь, что все работает так же, как и в предыдущем представлении post_list. Это простой пример представления на основе класса, использующего универсальный(базовый) класс, предоставленный Джанго. Вы узнаете больше о представлениях, основанных на классах, в главе 10 и последующих главах.