Класс TemplateView
Класс TemplateView применяется для отображения шаблонов
без необходимости написания функции-контроллера. Он наследуется
от базового класса View и предоставляет готовую реализацию
для рендеринга шаблонов с контекстом. Основное преимущество
этого класса в том, что он автоматически обрабатывает GET-запросы
и возвращает ответ с отрендеренным шаблоном. Класс принимает
параметр template_name для указания пути к шаблону.
Синтаксис
from django.views.generic import TemplateView
class MyView(TemplateView):
template_name = 'path/to/template.html'
Пример . С использованием в urls
Давайте создадим представление для отображения главной страницы:
from django.views.generic import TemplateView
from django.urls import path
urlpatterns = [
path('', TemplateView.as_view(template_name='index.html'), name='home'),
]
Пример . С передачей контекста
Давайте передадим данные в шаблон с помощью метода get_context_data:
from 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
Результат выполнения кода:
"Context contains list of 2 articles"
Пример . С параметрами из URL
Давайте создадим представление, которое принимает параметр из URL:
from 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
Результат выполнения кода:
"Context contains article with id 42"
Пример . С использованием дополнительных атрибутов
Давайте используем атрибуты extra_context и content_type:
from django.views.generic import TemplateView
class HomePageView(TemplateView):
template_name = 'home.html'
extra_context = {'title': 'Welcome', 'user_count': 1500}
content_type = 'text/html'
Результат выполнения кода:
"Extra context contains title and user_count"
Пример . С переопределением метода dispatch
Давайте переопределим метод dispatch для дополнительной логики:
from 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,
который специализируется на отображении списков объектов