Представления, основанные на классах, — это альтернативный способ внедрять представления в виде объектов, а не функций 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 построит общий QuerySetPost.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 Q <<. Там я и другие участники отвечаем на вопросы по python, программированию и контенту сайта.
Обучение Python и Data Science
Вам помогла эта статья? Поделитесь в соцсетях или блоге. Репосты помогают сайту развиться.