ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
View とは
Django MVT (Model-View-Template) パターンの「View」は、Web リクエストを受け取り、必要な処理を実行してレスポンスを返す Python 関数 / クラスです。他フレームワークでいう Controller に相当します。
View は views.py に書き、urls.py で URL とマッピングします。
Function-based View (FBV) — 最も基本
# myapp/views.py
from django.http import HttpResponse
from django.shortcuts import render, redirect, get_object_or_404
from .models import Article
# 最小の View
def hello(request):
return HttpResponse("Hello, Django!")
# テンプレートをレンダー
def index(request):
articles = Article.objects.all()
return render(request, "myapp/index.html", {"articles": articles})
# 詳細ページ
def detail(request, article_id):
article = get_object_or_404(Article, pk=article_id)
return render(request, "myapp/detail.html", {"article": article})
# POST 処理 + リダイレクト
def create(request):
if request.method == "POST":
Article.objects.create(
title=request.POST["title"],
body=request.POST["body"],
)
return redirect("myapp:index")
return render(request, "myapp/create.html")
URL マッピング
# myapp/urls.py
from django.urls import path
from . import views
app_name = "myapp"
urlpatterns = [
path("", views.index, name="index"),
path("hello/", views.hello, name="hello"),
path("article//", views.detail, name="detail"),
path("create/", views.create, name="create"),
]
# プロジェクト全体の urls.py
# project/urls.py
from django.urls import include, path
urlpatterns = [
path("myapp/", include("myapp.urls")),
]
Class-based View (CBV)
クラスベースは再利用性が高く、ミックスインで認証・権限・ページネーションを足せます。
# myapp/views.py
from django.views import View
from django.shortcuts import render, redirect
from .models import Article
class HelloView(View):
def get(self, request):
return render(request, "myapp/hello.html")
def post(self, request):
# POST 処理
return redirect("myapp:index")
# urls.py 側
# path("hello/", views.HelloView.as_view(), name="hello"),
ジェネリック CBV — 最強の生産性
CRUD で頻出のパターンを Django が用意してくれています:
| ジェネリック View | 用途 | テンプレート規約 |
|---|---|---|
ListView | 一覧 | app/model_list.html |
DetailView | 詳細 | app/model_detail.html |
CreateView | 新規作成 | app/model_form.html |
UpdateView | 編集 | app/model_form.html |
DeleteView | 削除 | app/model_confirm_delete.html |
TemplateView | 静的ページ | 任意 |
RedirectView | リダイレクト | テンプレート不要 |
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Article
class ArticleListView(ListView):
model = Article
paginate_by = 20 # ページネーション
ordering = ["-created_at"] # 降順
class ArticleDetailView(DetailView):
model = Article
class ArticleCreateView(CreateView):
model = Article
fields = ["title", "body"]
success_url = reverse_lazy("myapp:index")
class ArticleUpdateView(UpdateView):
model = Article
fields = ["title", "body"]
success_url = reverse_lazy("myapp:index")
class ArticleDeleteView(DeleteView):
model = Article
success_url = reverse_lazy("myapp:index")
レスポンスの種類
| 関数 / クラス | 用途 |
|---|---|
HttpResponse(text) | 素のレスポンス |
render(request, template, context) | HTML テンプレートをレンダー |
redirect(name_or_url) | リダイレクト (302) |
JsonResponse({...}) | JSON 返却 (Content-Type 自動) |
HttpResponseNotFound | 404 |
HttpResponseForbidden | 403 |
get_object_or_404(Model, pk=id) | 取得失敗で 404 |
FileResponse(open(...)) | ファイルダウンロード |
デコレータで認証 / メソッド制限
from django.contrib.auth.decorators import login_required, permission_required
from django.views.decorators.http import require_http_methods, require_POST, require_GET
from django.views.decorators.csrf import csrf_exempt
@login_required
def my_page(request):
return render(request, "myapp/mypage.html")
@require_POST
def post_only(request):
# GET でアクセスすると 405 Method Not Allowed
pass
@require_http_methods(["GET", "POST"])
@login_required
def secure_view(request):
pass
@permission_required("myapp.delete_article")
def admin_only(request):
pass
# CBV の場合
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
class SecureView(LoginRequiredMixin, View):
login_url = "/login/"
def get(self, request):
return render(request, "myapp/secure.html")
FBV vs CBV — どちらを選ぶ?
| 観点 | FBV | CBV |
|---|---|---|
| 学習コスト | 低い (Python 関数) | 中 (継承・MRO の理解) |
| コード量 | 多い (CRUD) | 少ない (ジェネリック) |
| 柔軟性 | 高い | 中 (定石を外すと面倒) |
| 再利用 | 低い | 高い (ミックスイン) |
| おすすめ | 独自処理、API エンドポイント | 典型的な CRUD |
FAQ
Q: View で DB を直接叩いて良い?
A: 単純な処理なら OK。複雑なビジネスロジックは services.py 等に切り出して View は薄く保つのが定石。
Q: API エンドポイントは何を使う?
A: Django REST Framework の APIView / ViewSet を使うとシリアライザ・パーミッション・ページネーションが揃って便利。
Q: 404 と 500 を独自テンプレートにするには?
A: templates/404.html / 500.html を配置し、settings.py の DEBUG = False + ALLOWED_HOSTS を設定すれば自動表示。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
同階層のページ
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?