Viewの継承

Viewの継承

Djangoが提唱しているViewの特徴の一つにViewの継承があります。
Viewの継承を使用すると同じコードを書く量を圧倒的に減らすことができます。

Viewのベースとして使用する

Viewの継承を行うケースはいくつかあります。
例えばページは違うがフロントエンドに投げるデータが同じ場合、以下のように記述することができます。

views.py

from django.views.generic import TemplateView

from .models import Article


ArticleListViewBase(TemplateView):

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

        articles = Article.objects.all().order_by('created')
        context['articles'] = articles
        return context


IndexView(ArticleListViewBase):

    template_name = 'index.html'

index = IndexView.as_view()


ArticleListView(ArticleListViewBase):

    template_name = 'article/list.html'

article_list = ArticleListView.as_view()


2ページ分のViewを書いていますがかなりコードがスッキリしたのがわかるでしょうか?

indexにもarticle_listにも同じArticleのデータを投げる場合、まずは継承元となるViewを記述します。
そしてこのViewにget_context_dataを記述して、データをフロントエンドに投げる処理を記述しています。

indexとarticle_listでは、このViewを継承するためにclassの引数に指定しています。
そして、template_nameを記述しているだけ。
たったこれだけで2ページ分のViewを作成することができました。
これなら仮にViewに変更が加わっても一箇所変更するだけで、機能の更新が可能です。

Viewの継承は、Pythonのクラス継承機能を用いています。

つまり、Viewに関係のない処理が発生する場合は、単純なPythonのクラスを記述して継承することが可能です。

getやpost、get_context_dataなどViewに依存する機能の場合は、同じようにクラスを継承して、Viewを継承することでコードを綺麗にまとめることができます。
ぜひ覚えておきましょう。