Класс TemplateView

Класс TemplateView применяется для отображения шаблонов без необходимости написания функции-контроллера. Он наследуется от базового класса View и предоставляет готовую реализацию для рендеринга шаблонов с контекстом. Основное преимущество этого класса в том, что он автоматически обрабатывает GET-запросы и возвращает ответ с отрендеренным шаблоном. Класс принимает параметр template_name для указания пути к шаблону.

Синтаксис

pythonfrom django.views.generic import TemplateView

class MyView(TemplateView):
  template_name = 'path/to/template.html'

Пример . С использованием в urls

Давайте создадим представление для отображения главной страницы:

pythonfrom django.views.generic import TemplateView
from django.urls import path

urlpatterns = [
  path('', TemplateView.as_view(template_name='index.html'), name='home'),
]

Пример . С передачей контекста

Давайте передадим данные в шаблон с помощью метода get_context_data:

pythonfrom django.views.generic import TemplateView

class ArticleListView(TemplateView):
  template_name = 'articles/list.html'

  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['articles'] = [
      {'title': 'First article', 'author': 'John'},
      {'title': 'Second article', 'author': 'Jane'},
    ]
    return context

Результат выполнения кода:

python"Context contains list of 2 articles"

Пример . С параметрами из URL

Давайте создадим представление, которое принимает параметр из URL:

pythonfrom django.views.generic import TemplateView

class ArticleDetailView(TemplateView):
  template_name = 'articles/detail.html'

  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    article_id = kwargs.get('id')
    context['article'] = {
      'id': article_id,
      'title': f'Article #{article_id}',
      'content': 'This is the article content',
    }
    return context

Результат выполнения кода:

python"Context contains article with id 42"

Пример . С использованием дополнительных атрибутов

Давайте используем атрибуты extra_context и content_type:

pythonfrom django.views.generic import TemplateView

class HomePageView(TemplateView):
  template_name = 'home.html'
  extra_context = {'title': 'Welcome', 'user_count': 1500}
  content_type = 'text/html'

Результат выполнения кода:

python"Extra context contains title and user_count"

Пример . С переопределением метода dispatch

Давайте переопределим метод dispatch для дополнительной логики:

pythonfrom django.views.generic import TemplateView
from django.http import HttpResponseForbidden

class AdminView(TemplateView):
  template_name = 'admin/dashboard.html'

  def dispatch(self, request, *args, **kwargs):
    if not request.user.is_authenticated:
      return HttpResponseForbidden('Access denied')
    return super().dispatch(request, *args, **kwargs)

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

  • базовый класс View,
    от которого наследуются все классовые представления
  • атрибут template_name,
    который указывает путь к используемому шаблону
  • метод get_context_data,
    который формирует контекст для шаблона
  • класс ListView,
    который специализируется на отображении списков объектов