以下の文はDjangoクラスベースビュー(CBV)探求シリーズの 6篇であり、 TemplateViewRedirectView を通じて 簡単なページレンダリングリダイレクト処理 を自動化する方法について説明します。前回の文(5篇)で CreateView, UpdateView, DeleteView を使用してCRUDを構築したなら、今回はもっと 軽量な ページと リダイレクト処理 をいかに効率的に構成できるかについて考えてみましょう。

前篇のリンクは以下をクリックしてください!

CreateView, UpdateView, DeleteViewでCRUDを実装する


“Django TemplateViewとRedirectViewで
簡単なページ構造とリダイレクトを簡単に自動化しましょう!”


1. TemplateView & RedirectView、なぜ必要か?

TemplateViewRedirectView はDjangoにおいて最も単純な用途に特化したクラスベースビュー(ジェネリックビュー)です。

  1. TemplateView

    • 特別なデータ処理ロジックなしに、 静的ページ簡単なコンテキスト をテンプレートに渡す時に便利です。

    • 例) “About” ページ, “FAQ” ページ, 404/500 などのエラーページ(別途設定時) など。

  2. RedirectView

    • 特定のURLに 即座に移動(リダイレクト) させる用途に使用します。

    • 例) ドメインルート(/)にアクセスした際に特定のページに移動, 簡単なショートURLサービス, キャンペーン宣伝用リダイレクトなど。

この2つはデータベース操作やフォーム検証を必要としない 単純 なページ処理に焦点を当てている点で、前述の 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 vs 302)
  • pattern_name: urls.pyURL名 (例: '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/にアクセスすると、'blog_list'に指定されたURLパターンにリダイレクトされます。

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 / ‘Coming Soon’ ページ: 製品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でも問題ないが、多くの静的ページやリダイレクトが増えると重複が発生 「必要な設定だけを属性やメソッドとして」分離されているため、メンテナンスが便利
開発生産性(キーワード) 「直接 render, redirect 関数を使用 -> 重複の可能性」 「時間節約(Time-saving)、コードの一貫性、メンテナンス性(Productivity boost)」

7. まとめと次回の予告

TemplateViewRedirectView はDjangoプロジェクトで 最も簡単なページ処理 を容易に管理できるクラスベースビューです。
DB連動やフォーム検証のような複雑なロジックが不要な場合、これらを使用すると 重複コード を減らし、 プロジェクト構造 をさらに綺麗に保つことができます。

私たちはCBVを使用して「静的ページ」「リダイレクト」「CRUD(作成/更新/削除)」「リスト/詳細表示」「フォーム処理」など
ウェブ開発の必須要素のほとんどを実装できるようになりました。

次回(シリーズ7篇)ではDjangoでよく使われる Mixin を活用して 共通機能 を簡単に再利用し、権限管理ログインチェック を効率的に実装する方法を紹介する予定です。


前の記事を再見

  1. クラスベースビュー(CBV)探求シリーズ #1 - FBVからCBVへの理由と開発者の姿勢
  2. クラスベースビュー(CBV)探求シリーズ #2 - Djangoの基本Viewクラスの理解
  3. クラスベースビュー(CBV)探求シリーズ #3 - FormViewでフォーム処理を簡単にする
  4. クラスベースビュー(CBV)探求シリーズ #4 - ListView & DetailViewの活用法
  5. クラスベースビュー(CBV)探求シリーズ #5 - CreateView, UpdateView, DeleteViewでCRUDを実装する

“TemplateViewとRedirectViewで手間のかかる静的ページ処理とリダイレクトを自動化し、
プロジェクトをさらにシンプルで生産的にしましょう!”