Блог на Django #18: Использование представлений, основанных на классах

356

Представления, основанные на классах, — это альтернативный способ внедрять представления в виде объектов, а не функций Python. Поскольку представление — это вызываемый объект, принимающий веб-запрос и возвращающий ответ, его можно определить в виде методов класса. Django предоставляет базовые классы представлений для этого. Они все наследуют класс View, который обрабатывает HTTP метод направления и другие функции.

Представления, основанные на классах, предлагают свои преимущества над представлениями, основанными на функциях в определенных случаях. У них есть следующие особенности:

  • Код, связанный с методами HTTP, такими как GET, POST или PUT, в отдельных методах, а не в ветках условий.
  • Использование наследования для создания классов представлений, которые можно использовать неоднократно (известны как mixins).

Подробно о представлениях, основанных на классах, можно почитать здесь: https://docs.djangoproject.com/en/2.0/topics/class-based-views/intro/.

Поменяем представление post_list на «классовое», чтобы использовать общий ListView из Django. Это базовое представление позволяет отображать объекты любого вида.

Отредактируйте файл views.py приложения blog и добавьте следующий код.

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 сообщается, что он должен:

  • Использовать конкретный QuerySet, а не получать все объекты. Вместо определения атрибута queryset, можно использовать определенный model = Post, и Django построит общий QuerySet Post.objects.all() автоматически.
  • Использовать контекстную переменную posts для запроса результатов. Если context_object_name не определена, то переменная по умолчанию — object_list.
  • Разбить результат на страницы по три объекта на каждой.
  • Использовать кастомный шаблон для рендеринга. Если шаблон по умолчанию не указан, ListView использует blog/post_list.html.

Теперь откройте файл urls.py приложения blog, закомментируйте предыдущий URL-шаблона post_list и добавьте новый с помощью класса PostListView:

urlpatterns = [  
    # post views  
    # path('', views.post_list, name='post_list'),  path('', views.PostListView.as_view(), name='post_list'),  
    path('<int:year>/<int:month>/<int:day>/<slug:post>/',  
	 views.post_detail,  
	 name='post_detail'),  
]

Чтобы пагинация работала, нужно использовать правильный объект страницы, который передается шаблону. Общее представление Django ListView передает выбранную страницу переменной page_obj, поэтому нужно отредактировать шаблон post/list.html. Это необходимо, чтобы пагинатор использовать правильную переменную:

{% include "pagination.html" with page=page_obj %}

Откройте https://127.0.0.1:8000/blog/ в бразуере и проверьте, чтобы все работало так же, как и с прошлым представлением post_list. Это простой пример представления, основанного на классах, использующего общий класс Django.

Итого

Вы узнали основы веб-фреймворка Django и создали базовое приложение блога. Разработали модели данных и применили миграции. Создали представления, шаблоны и URL для проекта, включая пагинацию.

Дальше речь пойдет об улучшении приложения с помощью системы комментариев и функции проставления тегов, а также возможности пользователям делиться постами через электронную почту.

Тест на знание python

Что выведет этот код?
Как в Python называется встроенная библиотека для использования регулярных выражений?
Какой будет результат выполнения кода — print(abc) ?
Верно ли данное утверждение: "В Python есть два типа данных: числа и строки"?
Что выведет этот код?