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

158

Представления, основанные на классах, — это альтернативный способ внедрять представления в виде объектов, а не функций 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 %}

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

Итого

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

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

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

Что выведет этот код?
Что выведет этот код?
Какой будет результат выполнения этого кода?
Что выведет этот код?
Что выведет этот код?
Викиум