自動化無しに生活無し

WEBとかAIとかLinux関係をひたすら書く備忘録系ブログ

【Django】ビュークラスの継承を使い、予めcontextを追加させる

thumbnail

クラスベースのビューであれば、継承をするだけで、継承関係にある全てのビューに同じ機能を追加できる。

どのページでも表示させるデータ(例えば、サイトのトップバーに表示するニュースなど)にも継承を使えば、予めの追加が実現できる。

以下は、40分Djangoにビュークラスの継承を行い、contextを追加するメソッドを呼び出せるようにしている。

from django.shortcuts import render,redirect

from django.views import View
from .models import Topic

class ContextView(View):
    
    def context(self):
        context = {}
        context["news"]   = Topic.objects.order_by("-id")[:10]

        return context

class BbsView(ContextView):

    def get(self, request, *args, **kwargs):
        context = self.context()
        context["topics"]   = Topic.objects.order_by("-id")


        return render(request,"bbs/index.html",context)

    def post(self, request, *args, **kwargs):

        posted  = Topic( comment = request.POST["comment"] )
        posted.save()

        return redirect("bbs:index")

index   = BbsView.as_view()

もし、既にビュークラスが作られており、この継承をするのがめんどくさい場合、MIDDLEWAREによる呼び出しでも問題はないとおもう。

とは言え、リクエストオブジェクトに直接属性追加をするぐらいなら、context_processersを作り、settings.pyにて追加したほうが安全で良いかもしれない。もっとも、いずれも今回のビュークラスを継承する形式とは違い、全てのリクエストでDBアクセスが発生するので、少々無駄が多い点は明らかである。

コードで楽してDBに負荷をかけるか、それともしっかりコードを書いてDBを楽させるかは、開発者次第かと。

スポンサーリンク

シェアボタン

Twitter LINEで送る Facebook はてなブログ