Djangoのジェネリックメソッド
記事No.91
更新日時2023年03月30日
■記事ページを表示中
記事No.91
更新日時2023年03月30日
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メソッドは、以下のジェネリックビューで定義されています。
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
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)
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技術を一緒に勉強していけたらと思います。