ホーム >  Python > Django >  Djangoの汎用ビュー入門(TemplateView)


Posted:2018/05/09 9:00:45 AM|Category : Django

Djangoの汎用ビュー入門(TemplateView)

Djangoは、汎用ビューを使って簡易的なコーディングでアプリケーションを作成することができます。

汎用ビューとは?

「汎用ビュー(Generic View)」とは、Viewを少ないコーディングする方法です。汎用ビューは、何度も同じようなコードを書かなくても済むように、あらかじめDjangoに処理を定義してあります。関数で提供されていれば「関数ベース汎用ビュー」、クラスで提供されていれば「クラスベース汎用ビュー」と呼びます。

DjangoはMTV(Model, Template, View)という基本構造があります。Viewとは、テンプレートにデータを供給するものです。尚、ViewはRailsでいうところのコントローラーに当たります。

汎用ビューの今現状

昔(古いバージョンのDjango)は関数ベースの汎用ビューを使ってたようです。最近では、主にクラスベースのビューを使います。クラスベース汎用ビューについては、以下の公式の和訳ドキュメントをご参考に。

クラスベースビュー

汎用ビューの使い方

汎用ビューは、モデルやフォームなどに応じて適切なデフォルト値を予め設定してくれます。よって、プログラマが記述する量がとても少なくなるという利点があります。プログラマは、汎用ビューのクラスを継承し、必要であればクラス変数を変更し、またメソッドをオーバーライドして自身の処理を挿入したりできます。

前提

①以下のようなDjangoアプリ構成を作ります。プロジェクト名が「pj1」で、アプリケーション名が「users」です。プロジェクトの設定は済ませたものとします。赤字のファイルは、今回変更する部分です。

  • pj1/
  • pj1/
  • __init__.py
  • settings.py
  • urls.py
  • wsgi.py
  • users/
  • __init__.py
  • admin.py
  • apps.py
  • urls.py
  • views.py
  • models.py
  • templates/
  • index.html
  • manage.py

初級編

汎用ビューは主にviews.pyで使用されます。また、そのViewをurls.pyでas_view()という関数でURLを紐つけます。Djangoプロジェクト内に「user」というアプリケーションを作成したとします。

from django.views.generic import TemplateView

class SampleTemplateView(TemplateView):
    template_name = "index.html"

TemplateViewが汎用ビューです。TemplateViewはテンプレートを使って描画させます。django.views.genericに、それぞれの用途に応じたビューが準備されていますので、importします。

他の汎用ビューを使えば、DBからデータを取得するコードを書くこと無く一覧表示ができたり、特定の条件で絞り込んだあとのデータを出力することができます。

from foo.views import SampleTemplateView

urlpatterns = [
    url(r'^sample$', SampleTemplateView.as_view()),
]

「/sample」にアクセス際にSampleTemplateViewが処理を行います。

テンプレートに自分で設定した変数を渡す場合

ただ単にテンプレートを表示するだけでなく、DBから読み込んだデータを表示したいときがあります。その場合、汎用ビューで定義されているメソッドをオーバーライドします。一般的に「get_context_data」をオーバーライドして使用されます。

「get_context_data」は、templateに渡すcontextを取得します。

from django.views.generic import TemplateView


class SampleTemplate(TemplateView):

    template_name = "index.html"

    def get_context_data(self, **kwargs):
        # 継承元のメソッド呼び出し
        context = super().get_context_data(**kwargs) 
        context["foo"] = "bar"
        return context

テンプレートでfooという変数を使えるようにしています。

<div class="sample">{{ foo }}</div>

テンプレートで{{ foo }}とすればbarと表示されます。

TemplateView

Webサービスのサーバ処理の大半は、HTMLテンプレートを読み込んでそこに表示用変数を当てはめます。そのために Djangoで用意されているのが、TemplateView (django.views.generic.base.TemplateView)です。シンプルなクラスですが、ページ生成に必要な機能が含まれているビュークラスです。

TemplateViewの使いみち

TemplateViewは、テンプレートを指定して何かを表示する汎用ビューです。したがって、テンプレート名はかならず指定します。

TemplateViewとForViewの違い

クラスベースドビュー形式でビューを作るとき、ブラウザから「HTTP GET」されるビューは、ほとんどがTemplateViewで書かれます。

POSTの場合は、FormViewを使い、Viewで処理して「HttpResponseRedirect」を返すパターンが多いです。ただ、TemplateView は様々なパターンで書くことができますので、すべてこの通りとは限りません。


トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告