記事ページを表示中

Djangoのジェネリックメソッド

記事No.91

更新日時2023年03月30日

get_context_dataメソッド

context(辞書型のデータ)をテンプレートに反映させるメソッドです。

contextの内容は、各ジェネリックビュー毎に異なります。

独自のコンテキスト情報を追加したい場合は、get_context_dataを以下のようにオーバーライドします。

チェックポイント

オーバーライドとは、親クラスで定義されているメソッドを、子クラスで上書きする事

#views.py

from django.utils import timezone
from django.views.generic.list import ListView

from articles.models import Article

class ArticleListView(ListView):

    model = Article
    paginate_by = 100  # if pagination is desired

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['now'] = timezone.now()
        return context

各クラスのget_context_dataメソッド

get_context_dataメソッドは、各ジェネリックビュー毎に内容が異なります。

get_context_dataメソッドは、以下のジェネリックビューで定義されています。

  • ContextMixin
  • MultipleObjectMixin
  • FormMixin

ContextMixin

ContextMixinクラスでは、get_context_dataメソッドの引数と、extra_context属性の値を、統合した辞書を返しています。

class ContextMixin:
    extra_context = None
    def get_context_data(self, **kwargs):
        #setdefaultは辞書にキーが存在しない時のみ要素を追加するメソッド
        kwargs.setdefault("view", self)
        if self.extra_context is not None:
            #updateは辞書を更新するメソッド
            kwargs.update(self.extra_context)
        return kwargs

MultipleObjectMixin

class MultipleObjectMixin(ContextMixin):
    """A mixin for views manipulating multiple objects."""

    allow_empty = True
    queryset = None
    model = None
    paginate_by = None
    paginate_orphans = 0
    context_object_name = None
    paginator_class = Paginator
    page_kwarg = "page"
    ordering = None

    def get_context_data(self, *, object_list=None, **kwargs):
        """Get the context for this view."""
        queryset = object_list if object_list is not None else self.object_list
        page_size = self.get_paginate_by(queryset)
        context_object_name = self.get_context_object_name(queryset)
        if page_size:
            paginator, page, queryset, is_paginated = self.paginate_queryset(
                queryset, page_size
            )
            context = {
                "paginator": paginator,
                "page_obj": page,
                "is_paginated": is_paginated,
                "object_list": queryset,
            }
        else:
            context = {
                "paginator": None,
                "page_obj": None,
                "is_paginated": False,
                "object_list": queryset,
            }
        if context_object_name is not None:
            context[context_object_name] = queryset
        context.update(kwargs)
        return super().get_context_data(**context)

FormMixin

class FormMixin(ContextMixin):
    """Provide a way to show and handle a form in a request."""

    initial = {}
    form_class = None
    success_url = None
    prefix = None

    def get_context_data(self, **kwargs):
        """Insert the form into the context dict."""
        if "form" not in kwargs:
            kwargs["form"] = self.get_form()
        return super().get_context_data(**kwargs)

著者情報

名前:スカーレット
2010年からWEBサイトやWEBアプリを作成しています。最初は趣味でブログを書いていましたがSEOを勉強するのが楽しくなり、そのままブロガーとして独立しました。その後、記事を書くだけでは物足りなくなり自分でWEBアプリの作成をスタート。現在はブロガー兼プログラマーとして活動しています。このWEBアプリ(ブロトーク)もDjangoで自作しました。ブロトークはブログとSNSを合体させたようなWEBアプリです。ブログを読んで気づいた事や感想などあれば、気軽にメッセージを送って頂ければと思います。WEB技術を一緒に勉強していけたらと思います。