Использование базовых классов представлений(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 и последующих главах.

results matching ""

    No results matching ""