クラスベース汎用ビューの入門と使い方サンプル(もうすこし詳しく) #2

さて、今回はクラスベース汎用ビューの具体的な使い方を書いていきたいと思います。

前回のポストでListViewについて少し触れているので、そこからスタートしたいと思います。



ListView

from django.views.generic import ListView

from .models import Article

class ArticleListView(LisView):
    model = Article

のように、としてインポートして使います。 model = Article は、リストとして取得したいモデルを指定しておけば、自動で取得してくれます。

しかし、ここでは全件取得してしまいます。ページネーションなどで分割したい場合は、パラメーターを足します。

class ArticleListView(ListView):
    model = Article
    paginated_by = 10

paginated_by は取得するデータを文字通り分割して取得します。 今回は10件にしてみました。 ListViewは分割取得もはじめから組み込まれています。

DetailView

リスト表示があるのであれば個別表示もあるでしょう。

それがDetailViewです。

from django.views.generic import DetailView

class ArticleDetailView(DetailView):
    model = Article

相変わらずモデルは指定が必要です。

get_context_dataメソッド

クラスベース汎用ビューを使っていて、汎用ビューで管理されている以外のデータを挿入したいというニーズはよくあります。

そんなときは、フックに使えるメソッドがあるのでそこにデータを挿入します。

大体のクラスベース汎用ビューには、get_context_dataメソッドがあります。

このメソッドは、テンプレートに渡すデータを取得するメソッドです。

ですので、このメソッドをオーバーライドして、自身の処理を挿入しましょう。

from django.views.generic import ListView

from .models import Article

class ArticleListView(ListView):
    model = Article

    def get_context_data(self, **args):
        context = super().get_context_data(**args)

        context['name'] = 'Dai Takahashi'

        return context

のようにします。

super関数で親クラスの同メソッドを呼び出すと、ListViewがテンプレートに渡す前のデータを返します。 これは辞書ですので、キーを指定して、値を入れておけばテンプレートで呼び出すことができるようになります。

今回の場合、contextという変数で辞書を受け取りました。

続いて、nameというキーで、Dai Takahashiという値を入れています。

最後にreturn contextで変数を返せば良いです。

こうすることにより、テンプレートでは {{ name }} という形で使用できます。

もちろん、他のモデルのデータを呼び出したりすることもできるので、上手に使ってください。

まとめ

こういった表示系の汎用ビューはあまりカスタマイズすることがありません。

しかし、同じページに他のデータを挿入しておきたいケースはよくあると思います。

get_context_dataでほとんど対応できると思います。

全てのページに同じ変数をセットしておきたい場合は、コンテキストプロセッサーというのがあるので、そちらを使うと良いと思います。

また、テンプレートについてはまた別途記事にしたいと思います。


初稿: 2019年10月28日0:24 | 最終編集: 2019年11月25日22:33