Ниже приведена 6-я часть серии исследований классов на основе представлений Django (CBV), в которой рассматривается, как автоматизировать простой рендеринг страниц и обработку редиректов с помощью TemplateView и RedirectView. Если в предыдущей части (часть 5) вы реализовали CRUD с помощью CreateView, UpdateView и DeleteView, то сейчас мы узнаем, как более легко организовать обработку страниц и редиректов.

Чтобы перейти к предыдущей части, нажмите на ссылку ниже!

Реализация CRUD с помощью CreateView, UpdateView и DeleteView


“Автоматизируйте простую структуру страниц и редиректы с помощью Django TemplateView и RedirectView!”


1. TemplateView & RedirectView: зачем они нужны?

TemplateView и RedirectView - это специализированные классы представлений в Django для самых простых случаев.

  1. TemplateView

    • Полезен в случае передачи статических страниц или простого контекста в шаблон без дополнительной логики обработки данных.

    • Примеры: страница «О нас», страница «Часто задаваемые вопросы», страницы ошибок 404/500 (при отдельной настройке) и т.д.

  2. RedirectView

    • Используется для немедленного перенаправления на определенный URL.

    • Примеры: перенаправление на определенную страницу при доступе к корню домена (/), простая служба сокращения URL, редирект для промоакций и т.д.

Оба этих класса сосредоточены на простых обработках страниц, не требующих манипуляций с базами данных или проверки форм, и отличаются от ранее рассмотренных FormView, CreateView и других.


2. Как использовать TemplateView

Схема работы TemplateView - Автоматический рендеринг HTML

2.1 Основная структура

# views.py
from django.views.generic import TemplateView

class HomePageView(TemplateView):
    template_name = 'home.html'
  • template_name: указывает путь к файлу шаблона для рендеринга.

  • Не требуется переопределение отдельного метода get(), так как по умолчанию при GET-запросе шаблон, указанный в template_name, будет отрендерен.

2.2 Связывание с urls.py

# urls.py
from django.urls import path
from .views import HomePageView

urlpatterns = [
    path('', HomePageView.as_view(), name='home'),
]
  • При доступе к корневому URL ("") будет показан шаблон home.html.

2.3 Пример шаблона: home.html

<!DOCTYPE html>
<html>
<head>
  <title>Главная страница</title>
</head>
<body>
  <h1>Здравствуйте! Это главная страница.</h1>
</body>
</html>

3. Передача контекстных данных в TemplateView

RedirectView - Умное перенаправление с автоматической обогаченной настройкой

Помимо простого рендеринга шаблона, если вы хотите передать простые переменные в шаблон, необходимо переопределить метод get_context_data().

from django.views.generic import TemplateView

class AboutPageView(TemplateView):
    template_name = 'about.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['page_title'] = 'О нас'
        context['description'] = 'Этот сайт является примером для демонстрации Django CBV.'
        return context

Таким образом, в шаблоне можно использовать переменные page_title и description:

<!-- about.html -->
<!DOCTYPE html>
<html>
<head>
  <title>{{ page_title }}</title>
</head>
<body>
  <h1>{{ page_title }}</h1>
  <p>{{ description }}</p>
</body>
</html>

Совет:

  • TemplateView особенно полезен для создания простых страниц, не требующих DB-запросов, а также

  • если вам нужны общие переменные в нескольких шаблонах, подумайте о сочетании с Mixin или базовым шаблоном.


4. Как использовать RedirectView

4.1 Основная структура

# views.py
from django.views.generic import RedirectView

class BlogRedirectView(RedirectView):
    pattern_name = 'blog_list'  # Имя URL

    # (опционально) Здесь можно указать параметры, необходимые для обратного URL
    # query_string = True        # необходимость сохранения строки запроса
    # permanent = False         # постоянный редирект (301 против 302)
  • pattern_name: укажите имя URL из urls.py (например, 'blog_list'), чтобы при выполнении представления перенаправить на этот путь.

  • Если вы установите permanent=True, будет выполнен постоянный редирект (301), а по умолчанию (False) будет выполнен временный редирект (302).

  • Если установить query_string=True, строка запроса из существующего URL (?page=2 и т. д.) будет также прикреплена к целевому URL редиректа.

4.2 Связывание с urls.py

# urls.py
from django.urls import path
from .views import BlogRedirectView, HomePageView

urlpatterns = [
    path('go-to-blog/', BlogRedirectView.as_view(), name='go_to_blog'),
    path('', HomePageView.as_view(), name='home'),
]
  • При доступе к /go-to-blog/ будет выполнен редирект на URL-петр 'blog_list'.

4.3 Указание прямого URL

Также возможно напрямую вставить абсолютный путь или внешнюю ссылку в атрибут url, а не имя URL.

class ExternalRedirectView(RedirectView):
    url = 'https://www.djangoproject.com/'

urlpatterns = [
    path('django-home/', ExternalRedirectView.as_view(), name='django_home'),
]
  • В этом случае будет выполнен редирект с /django-home/https://www.djangoproject.com/.

5. Примеры использования TemplateView & RedirectView

  1. Страница уведомлений: можно использовать TemplateView для отображения статической страницы с фиксированным содержимым уведомлений без подключения базы данных.

  2. FAQ / «Скоро будет» страница: также полезно для быстрого создания страниц FAQ о продуктах или временных страниц техобслуживания.

  3. Редирект с корня домена: можно автоматизировать простую логику редиректа, например, «при доступе к главной странице перенаправить на /home/» с помощью RedirectView.

  4. Ссылки на внешние сервисы: также полезно для перенаправления на внешние сайты при доступе к определенному пути, подобно сокращенным URL.


6. Сравнение с FBV

Функция FBV (представление на основе функций) TemplateView / RedirectView (представление на основе классов)
Рендеринг статических страниц (например, FAQ) def faq(request): return render(request, 'faq.html') и т. д. TemplateView: достаточно указать template_name, и страница будет автоматически отрендерена.
Простое перенаправление return redirect('some_url') / HttpResponseRedirect(...) RedirectView: просто укажите URL или pattern_name.
Передача дополнительных контекстов Необходимо каждый раз context = {...} -> render(...) Можно управлять структурированным и последовательным образом с помощью get_context_data().
Структура кода / Обслуживание FBV не является проблемой на коротких страницах или простых редиректах, но дублирование может возникнуть, когда количество статических страниц или редиректов увеличивается. “Необходимые настройки разделены на свойства или методы”, что упрощает обслуживание.
Производительность разработки (ключевое слово) “Используйте функции рендеринга, редиректа -> риск дублирования.” “Экономия времени, согласованность кода, удобство обслуживания.”

7. Заключение и анонс следующей части

TemplateView и RedirectView - это классы на основе представлений, которые помогают легко управлять самыми простыми обработками страниц в проектах Django.
Когда не требуется сложная логика, такая как работа с БД или проверка форм, использование этих классов позволяет уменьшить дублирование кода и поддерживать структуру проекта в более чистом виде.

Теперь мы можем реализовать большинство необходимых компонентов веб-разработки, такие как “статические страницы”, “редирекции”, “CRUD (создание/редактирование/удаление)”, “списки/детализированное представление” и “обработку форм” с помощью CBV!

В следующей части (часть 7) мы представим, как эффективно использовать Mixin в Django для простого повторного использования общих функций и реализации управления правами доступа и проверку входа.


Посмотреть предыдущие записи

  1. Исследование класса на основе представлений (CBV) серия #1 – Причины перехода от FBV к CBV и отношение разработчика
  2. Исследование класса на основе представлений (CBV) серия #2 – Понимание основных классов представлений Django
  3. Исследование класса на основе представлений (CBV) серия #3 – Легкая обработка форм с FormView
  4. Исследование класса на основе представлений (CBV) серия #4 – Как использовать ListView и DetailView
  5. Исследование класса на основе представлений (CBV) серия #5 – Реализация CRUD с помощью CreateView, UpdateView и DeleteView

“Автоматизируйте утомительную обработку статических страниц и редиректы с помощью TemplateView и RedirectView и сделайте проект более компактным и эффективным!”