Python | Web フレームワーク:Django のビュー

Python
スポンサーリンク

概要(Django のビュー=「URL ごとに何を返すかを決める場所」)

Django の「ビュー」は、

「この URL にアクセスされたら、どんな処理をして、どんなレスポンスを返すか」

を決める場所です。

MVC でいうと、Django の view は実質「コントローラ」の役割で、
テンプレート(HTML)やモデル(DB)と連携しながら、
最終的なレスポンス(HTML や JSON など)を返します。

Django ではビューは大きく分けて
関数ベースビュー(Function-Based View, FBV)
クラスベースビュー(Class-Based View, CBV)
の 2 つの書き方がありますが、どちらも「URL → 処理 → レスポンス」という本質は同じです。

ここでは、まず FBV で感覚を掴み、そのあとで CBV のイメージまでかみ砕いていきます。


まずは関数ベースビュー(FBV)で「ビューの正体」を掴む

一番シンプルなビュー関数の形

Django のビューの最小形は「関数 1 個」です。

# app/views.py
from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello, Django!")
Python

この関数は、

request(HttpRequest オブジェクト)を受け取り
HttpResponse を返す

という形になっています Qiita

Django は「ビューとは、HttpRequest を受け取って HttpResponse を返すもの」という約束で動いています。

このビューを URL に紐づけると、
ブラウザからアクセスできるようになります。

# app/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("hello/", views.hello, name="hello"),
]
Python

これで http://localhost:8000/hello/ にアクセスすると、
ブラウザには「Hello, Django!」と表示されます。

ここで押さえたいのは、

ビューは「ただの Python 関数」
URLconf(urls.py)で「どの URL でその関数を呼ぶか」を決める

という 2 段構えになっていることです。

テンプレートと組み合わせて HTML を返す

実用的には、文字列だけでなく HTML を返すことが多いです。

# app/views.py
from django.shortcuts import render

def index(request):
    context = {"username": "Taro"}
    return render(request, "index.html", context)
Python

render() は、

テンプレートファイル(index.html)を読み込み
context のデータを流し込み
完成した HTML を HttpResponse として返す

という便利関数です。

ビューの役割はここでも同じで、

リクエストを受け取る
必要なデータを用意する(DB から取るなど)
テンプレートに渡してレスポンスを返す

という流れをまとめる場所です。


ビューの中で「何をやるか」の基本パターン

1. URL パラメータを受け取る

例えば、/items/1/ のように ID 付きの URL からデータを表示したい場合。

# app/urls.py
urlpatterns = [
    path("items/<int:item_id>/", views.item_detail, name="item_detail"),
]
Python
# app/views.py
from django.http import HttpResponse

def item_detail(request, item_id):
    return HttpResponse(f"Item ID: {item_id}")
Python

URL パターンで <int:item_id> と書くと、
ビュー関数の引数 item_id にその値が渡されます。

ビューは「URL から値を受け取って処理する」場所でもあります。

2. モデルと連携してデータを取得する

ビューの本領は「モデル(DB)とテンプレートの橋渡し」です。

# app/models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
Python
# app/views.py
from django.shortcuts import render, get_object_or_404
from .models import Book

def book_detail(request, book_id):
    book = get_object_or_404(Book, id=book_id)
    return render(request, "book_detail.html", {"book": book})
Python

ここでビューは、

URL から book_id を受け取る
Book モデルから該当レコードを取得する
テンプレートに渡して HTML を返す

という「調整役」を担っています。

Django の世界観では、

モデル:データの構造と DB 操作
テンプレート:見た目(HTML)
ビュー:その間をつなぐロジック

という役割分担になっています。


クラスベースビュー(CBV)のイメージをつかむ

「ビューをクラスとして書く」もう一つのスタイル

関数ベースビューに慣れてきたら、
Django が用意している「クラスベースビュー(CBV)」も知っておくと便利です。

クラスベースビューは、

ビューを関数ではなく「クラス」として定義するスタイル
HTTP メソッドごとにメソッド(get, post など)を分けられる
共通処理を継承やミックスインで再利用しやすい

といった特徴があります。

最もシンプルな CBV の例はこんな感じです。

# app/views.py
from django.http import HttpResponse
from django.views import View

class HelloView(View):
    def get(self, request):
        return HttpResponse("Hello from CBV")
Python
# app/urls.py
from django.urls import path
from .views import HelloView

urlpatterns = [
    path("hello/", HelloView.as_view(), name="hello_cbv"),
]
Python

ここでのポイントは、

クラスに get(self, request, ...) を定義すると、GET リクエスト時に呼ばれる
URLconf では HelloView.as_view() を渡す(これが「ビュー関数」として振る舞う)

という仕組みです。

汎用クラスベースビュー(Generic CBV)で CRUD を一気に楽にする

Django には、よくあるパターン(一覧表示、詳細表示、作成、更新、削除)を
あらかじめクラスとして用意した「汎用クラスベースビュー」があります。

例えば、Book の一覧を表示するだけなら、
ほとんどコードを書かずに済みます。

# app/views.py
from django.views.generic import ListView
from .models import Book

class BookListView(ListView):
    model = Book
    template_name = "book_list.html"
Python
# app/urls.py
from django.urls import path
from .views import BookListView

urlpatterns = [
    path("books/", BookListView.as_view(), name="book_list"),
]
Python

ListView は、

指定されたモデル(model = Book)を全部取得し
指定されたテンプレートに object_list として渡す

という処理を自動でやってくれます。

同様に、DetailViewCreateViewUpdateViewDeleteView などもあり、
CRUD 画面をかなり少ないコードで作れます。

CBV の本質は、

「よくあるビューのパターンをクラスとして再利用し、
継承やオーバーライドでカスタマイズしやすくする」

というところにあります。


FBV と CBV の使い分けの感覚

初心者はまず「関数ベースビューで流れを理解」する

最初のうちは、
関数ベースビュー(FBV)で

リクエストを受け取る
モデルからデータを取る
テンプレートに渡して返す

という一連の流れを体で覚えるのがおすすめです。

FBV は「ただの関数」なので、
Python の基礎が分かっていれば読みやすく、
デバッグもしやすいです。

パターンが見えてきたら「クラスベースビューで共通化」する

ある程度慣れてくると、

一覧表示のビューがどれも似たようなコード
詳細表示も毎回同じようなパターン
フォームの表示と保存処理も似ている

といった「繰り返し」が見えてきます。

そこで CBV(特に汎用 CBV)を使うと、

ListView で一覧
DetailView で詳細
CreateView / UpdateView でフォーム

といった形で、
共通パターンをクラスとして再利用できるようになります。

Django 公式も、
「クラスベースビューは関数ベースビューを完全に置き換えるものではなく、
パターンを抽象化して再利用しやすくするためのもう一つの手段」
と説明しています。


まとめ(ビューは「URL と処理とレスポンスをつなぐ中枢」)

Django のビューを初心者向けに整理すると、こうなります。

ビューは「HttpRequest を受け取り、HttpResponse を返す」関数(またはクラス)であり、URLconf で URL と結びつけることで「この URL に来たらこの処理」という対応を作る。
関数ベースビュー(FBV)はシンプルで読みやすく、まずはここで「リクエスト → モデル → テンプレート → レスポンス」の流れを掴むのが良い。
クラスベースビュー(CBV)はビューをクラスとして表現し、HTTP メソッドごとにメソッドを分けたり、汎用クラス(ListView, DetailView など)を継承して CRUD を少ないコードで実装できる。
FBV と CBV はどちらが正解というより、「小さく柔軟に書きたいときは FBV」「パターン化された画面や CRUD を効率よく書きたいときは CBV」という使い分けの感覚で捉えるとよい。

タイトルとURLをコピーしました