概要(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)
Pythonrender() は、
テンプレートファイル(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}")
PythonURL パターンで <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"),
]
PythonListView は、
指定されたモデル(model = Book)を全部取得し
指定されたテンプレートに object_list として渡す
という処理を自動でやってくれます。
同様に、DetailView、CreateView、UpdateView、DeleteView などもあり、
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」という使い分けの感覚で捉えるとよい。

