Django 5 для начинающих

Прогресс по курсу:  9/1004

10.3 Работа с ListView, вывод списка статей
2 из 13 шагов пройдено
0 из 48 баллов  получено

Что такое представления на основе классов?

Другой способ реализовать представления объектами 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)

В следующем шаге мы создадим шаблоны для этого метода на основе классов.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Вероятно, в курсе по Django 5 имеет смысл вставлять соответствующие ссылки:

https://ccbv.co.uk/projects/Django/5.0/django.views.generic.list/ListView/

Каждое родительское представление и миксин добавляют или улучшают набор атрибутов и методов для нашего встроенного представления. Полный список атрибутов и методов мы можем посмотреть по этой ссылке.

@ilya_kutaev, спасибо, исправил.

В то время как Django предоставляет нам ряд встроенных классовых представлений для работы, в основе всех этих представлений лежит в одном основном представлении под названием View.

Думаю стоит заменить на

В то время как Django предоставляет нам ряд встроенных классовых представлений для работы, в основе всех этих представлений лежит представлениe под названием View

 

И второе предложение в этом же абзаце тоже непонятное, возможно там должно быть "будут унаследованы" и "он предоставляет"

Изменен Георгий Тимофеев

@Георгий_Тимофеев, спасибо, исправил.