Ниже приведена 6-я часть серии исследований классов на основе представлений Django (CBV), в которой рассматривается, как автоматизировать простой рендеринг страниц и обработку редиректов с помощью TemplateView и RedirectView. Если в предыдущей части (часть 5) вы реализовали CRUD с помощью CreateView
, UpdateView
и DeleteView
, то сейчас мы узнаем, как более легко организовать обработку страниц и редиректов.
Чтобы перейти к предыдущей части, нажмите на ссылку ниже!
Реализация CRUD с помощью CreateView, UpdateView и DeleteView
“Автоматизируйте простую структуру страниц и редиректы с помощью Django TemplateView и RedirectView!”
1. TemplateView & RedirectView: зачем они нужны?
TemplateView и RedirectView - это специализированные классы представлений в Django для самых простых случаев.
-
TemplateView
-
Полезен в случае передачи статических страниц или простого контекста в шаблон без дополнительной логики обработки данных.
-
Примеры: страница «О нас», страница «Часто задаваемые вопросы», страницы ошибок 404/500 (при отдельной настройке) и т.д.
-
-
RedirectView
-
Используется для немедленного перенаправления на определенный URL.
-
Примеры: перенаправление на определенную страницу при доступе к корню домена (
/
), простая служба сокращения URL, редирект для промоакций и т.д.
-
Оба этих класса сосредоточены на простых обработках страниц, не требующих манипуляций с базами данных или проверки форм, и отличаются от ранее рассмотренных FormView
, CreateView
и других.
2. Как использовать TemplateView
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
Помимо простого рендеринга шаблона, если вы хотите передать простые переменные в шаблон, необходимо переопределить метод 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
-
Страница уведомлений: можно использовать
TemplateView
для отображения статической страницы с фиксированным содержимым уведомлений без подключения базы данных. -
FAQ / «Скоро будет» страница: также полезно для быстрого создания страниц FAQ о продуктах или временных страниц техобслуживания.
-
Редирект с корня домена: можно автоматизировать простую логику редиректа, например, «при доступе к главной странице перенаправить на /home/» с помощью
RedirectView
. -
Ссылки на внешние сервисы: также полезно для перенаправления на внешние сайты при доступе к определенному пути, подобно сокращенным 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 для простого повторного использования общих функций и реализации управления правами доступа и проверку входа.
Посмотреть предыдущие записи
- Исследование класса на основе представлений (CBV) серия #1 – Причины перехода от FBV к CBV и отношение разработчика
- Исследование класса на основе представлений (CBV) серия #2 – Понимание основных классов представлений Django
- Исследование класса на основе представлений (CBV) серия #3 – Легкая обработка форм с FormView
- Исследование класса на основе представлений (CBV) серия #4 – Как использовать ListView и DetailView
- Исследование класса на основе представлений (CBV) серия #5 – Реализация CRUD с помощью CreateView, UpdateView и DeleteView
“Автоматизируйте утомительную обработку статических страниц и редиректы с помощью TemplateView и RedirectView и сделайте проект более компактным и эффективным!”
댓글이 없습니다.