【Django】 ビューの書き方 関数VSクラス

Djangoのビューを書き方は2種類ある。

・ビュー関数(Function Based Views)
・クラスベースビュー(Class Based Generic Views)

djangoの習熟がまだ未熟な頃、そもそも両者の違いとかも把握してなかった。
ある程度Djangoに慣れてきた頃どちらを使えばいいか分からず、
また書き方も頭の中でごちゃごちゃしてきたので整理と備忘録も兼ねて
ここにメモしておく。

どっちを使えばいいの?

結論から言うと、クラスベースビューがいいらしい。
理由としては

・コードが少なく、シンプルに書ける
・重たい処理をpost通信でやってくれる(関数だとgetで処理しちゃう)
・用途にあ合わせた(DBデータのCRUD処理バド)多様なビュークラスが利用できる

コード比較(ビュー関数VSクラスビュー)

PhotoBlogというモデルのDBのデータを一覧表示する処理をする
ビューのコードの書き方を関数とクラスで比較してみる。

●ビュー関数

#【views.py】

from django.shortcuts import render
from django.http import HttpResponse
from .models import PhotoBlog

def index(request):

      #PhotoBlogモデルのデータを全部取得して 、変数PhotoBlogsに格納
   PhotoBlogs = {'PhotoBlogs': PhotoBlog.objects.all() }

      #返すhtmlビューを定義し 、htmlで変数(ここではモデルのデータ)を扱えるように渡している
   return render(request,'index.html',PhotoBlogs)
#【urls.py】

urlpatterns = [
    path('', views.index, name='index'),
]
#【index.html】

    {% for PhotoBlog in PhotoBlogs %}
        <h3>{{PhotoBlog.Title}}</h3>
        <p>{{PhotoBlog.Content}}</p>
        <p>投稿者:{{PhotoBlog.User.username}}</p>
    {% endfor %}


●クラスビュー

#【views.py】

from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import ListView #クラスによるviewを利用するため 
from .models import PhotoBlog


class IndexView(ListView):
    # PhotoBlogテーブル連携
    model = models.PhotoBlog

    # レコード情報をテンプレートに渡すオブジェクト
    context_object_name = "photo_blog_list"

    # テンプレートファイル連携
    template_name = "index.html"
#【urls.py】

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
]
#【index.html】

    {% for PhotoBlog in photo_blog_list %}
        <h3>{{PhotoBlog.Title}}</h3>
        <p>{{PhotoBlog.Content}}</p>
        <p>投稿者:{{PhotoBlog.User.username}}</p>
    {% endfor %}

この程度の処理なら、両者のコード量は対して変わらない。
個人的に、web系フレームワークはこれまでLaravelしか触ってこなかったが、Laravelに慣れていると関数の方がどんな処理をしているかコードを見て
想像がつくが、クラスはパッと見た感じ何をしてるのか分からないという印象がした。
ただ、クラスの方がいいという意見が多いので、頑張ってクラスの書き方を覚えようと思う。


この記事が気に入ったらサポートをしてみませんか?