Что такое представления на основе классов?
Другой способ реализовать представления объектами Python вместо функций - это представления на основе классов. Они не заменяют представления, основанные на функциях, но имеют определенные отличия и преимущества перед представлениями на основе функций:
- Организация кода, относящаяся к конкретным методам HTTP (GET и POST т. д.), Может быть разделена методами вместо использования условного перехода.
- Объектно-ориентированные методы, такие как «миксины» (множественное наследование), могут использоваться для разложения кода на повторно используемые компоненты.
Класс View
В то время как Django предоставляет нам ряд встроенных классовых представлений для работы, основа всех этих представлений находится в одном основном представлении под названием View. Это класс, от которого будут наследоваться все другие представления, и он предоставляет нам основную функциональность для того, чтобы сделать представление на основе класса.
Но если мы захотим создать простое представление на View, которое запрашивает все продукты из нашей базы данных и отображает их в шаблоне, то мы должны написать подобный код:
from django.views.generic import View
from django.shortcuts import render
from .models import Product
class ProductList(View):
def get(self, request, *args, **kwargs):
products = Product.objects.all()
context = {'products':products}
return render(request, 'base/product_list.html', context)
def post(self, request, *args, **kwargs):
pass
Как мы видим, мы должны написать метод get в нашем классе, в котором должны указать запрос и в какой шаблон будем выводить результат. Но, Django содержит решения этих общих задач, поэтому нам не нужно самим писать всю логику.
Чтобы понять, как работают представления на основе классов Django, нам нужно понять, как они построены. Представления на основе классов Django обычно являются коллекцией других представлений и миксинов.
Давайте изначально рассмотрим представления на основе ListView.
ListView наследует непосредственно от 1 представления и 1 миксина, но содержит в себе в общей сложности 2 представления и 4 миксина, которые дают этому представлению все атрибуты и методы, которые он имеет.
Каждое родительское представление и миксин добавляют или улучшают набор атрибутов и методов для нашего встроенного представления. Полный список атрибутов и методов мы можем посмотреть по этой ссылке.
Приступим к практике, перейдем в файл views.py, в приложении blog и создадим наше первое представление для вывода списка статей:
from django.views.generic import ListView
from .models import Post
class PostListView(ListView):
model = Post
template_name = 'blog/post_list.html'
context_object_name = 'posts'
Наследуемся от ListView класса, это представление будет обрабатывать наш список объектов:
model- название нашей модели,Post.
template_name- По умолчаниюListViewищет шаблон с префиксом имени модели и суффиксом_list.html, если не установлено иное. Это можно переопределить, установив атрибутtemplate_name.
context_object_name- Переопределим имяQuerysetпо умолчаниюobject_list, установив атрибутcontext_object_name = 'posts'. Это помогает иметь более удобное для работы имя.
Нам необходимо добавить представление на основе классов PostListView в маршруты, создадим urls.py в приложении blog и добавим следующий код:
from django.urls import path
from .views import PostListView
urlpatterns = [
path('', PostListView.as_view(), name='home'),
]
Не забываем что необходимо подключить маршруты приложения blog в главном urls.py проекта:
from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('apps.blog.urls')),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
В следующем шаге мы создадим шаблоны для этого метода на основе классов.