Класс View

Класс View является базовым для всех классовых представлений в Django. Он определяет структуру, в которой каждый HTTP-метод (GET, POST и другие) обрабатывается отдельным методом класса. В отличие от функций-представлений, классы позволяют переиспользовать код через наследование и миксины.

Основной метод класса View - это dispatch, который определяет, какой метод вызвать в зависимости от HTTP-метода запроса. Класс принимает объект запроса (HttpRequest) и возвращает объект ответа (HttpResponse или его подкласс).

Синтаксис

pythonfrom django.views import View
from django.http import HttpResponse

class MyView(View):
  def get(self, request, *args, **kwargs):
    return HttpResponse('GET response')

  def post(self, request, *args, **kwargs):
    return HttpResponse('POST response')

Пример

Создадим простое представление, которое обрабатывает GET и POST запросы:

pythonfrom django.views import View
from django.http import HttpResponse

class SimpleView(View):
  def get(self, request, *args, **kwargs):
    return HttpResponse('This is GET request')

  def post(self, request, *args, **kwargs):
    return HttpResponse('This is POST request')

Чтобы использовать это представление в urls.py, нужно вызвать метод as_view:

pythonfrom django.urls import path
from .views import SimpleView

urlpatterns = [
  path('simple/', SimpleView.as_view(), name='simple_view'),
]

Пример

Внутри метода можно получить аргументы из URL или параметры запроса. Например, обработаем GET параметр name:

pythonfrom django.views import View
from django.http import HttpResponse

class GreetingView(View):
  def get(self, request, *args, **kwargs):
    name = request.GET.get('name', 'Guest')
    return HttpResponse(f'Hello, {name}!')

Результат для запроса с параметром ?name=John:

python"Hello, John!"

Пример

Класс View можно расширить, добавив свои методы. Например, создадим миксин для проверки аутентификации и используем его:

pythonfrom django.views import View
from django.http import HttpResponse
from django.contrib.auth.mixins import LoginRequiredMixin

class AuthenticatedView(LoginRequiredMixin, View):
  def get(self, request, *args, **kwargs):
    return HttpResponse('You are authenticated!')

Если пользователь не авторизован, Django автоматически перенаправит его на страницу входа (при правильной настройке LOGIN_URL).

Смотрите также

  • метод as_view,
    который преобразует класс во view-функцию
  • метод dispatch,
    который определяет, какой метод вызвать по HTTP-методу
  • метод get,
    который обрабатывает GET запросы
  • метод post,
    который обрабатывает POST запросы