ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
基本: View クラスを継承
# views.py
from django.views import View
from django.shortcuts import render, redirect
class ContactView(View):
# GET リクエスト
def get(self, request):
return render(request, 'contact.html', {
'form_data': None,
})
# POST リクエスト
def post(self, request):
name = request.POST.get('name', '')
email = request.POST.get('email', '')
if not name or not email:
return render(request, 'contact.html', {
'error': '入力エラー',
'form_data': request.POST,
})
# 処理(DB 保存・メール送信等)
return redirect('contact_thanks')# urls.py
from django.urls import path
from .views import ContactView
urlpatterns = [
# ★ as_view() を忘れずに
path('contact/', ContactView.as_view(), name='contact'),
]
関数ベースビュー (FBV) との比較
# FBV (関数ベース) - シンプル
def contact(request):
if request.method == 'GET':
return render(request, 'contact.html')
elif request.method == 'POST':
# ... 処理
return redirect('contact_thanks')
# CBV (クラスベース) - 構造化
class ContactView(View):
def get(self, request):
return render(request, 'contact.html')
def post(self, request):
# ... 処理
return redirect('contact_thanks')
| FBV (関数) | CBV (クラス) | |
|---|---|---|
| シンプルさ | ○ 学習コスト低 | △ 慣れが必要 |
| 再利用性 | △ コピペ気味に | ○ 継承・Mixin で共通化 |
| 標準機能 | すべて自分で書く | CreateView / UpdateView 等が便利 |
| カスタマイズ | 明示的 | メソッドオーバーライドで柔軟 |
| デバッグ | 追いやすい | クラス階層を辿る必要 |
FormView でフォーム処理
Django Forms と組み合わせるなら FormView が便利:
# forms.py
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(max_length=100)
email = forms.EmailField()
message = forms.CharField(widget=forms.Textarea)
# views.py
from django.views.generic.edit import FormView
from django.urls import reverse_lazy
class ContactView(FormView):
template_name = 'contact.html'
form_class = ContactForm
success_url = reverse_lazy('contact_thanks')
def form_valid(self, form):
# フォームが正しく送信された場合
name = form.cleaned_data['name']
email = form.cleaned_data['email']
# ... メール送信等
return super().form_valid(form) # success_url にリダイレクト
def form_invalid(self, form):
# バリデーションエラー時(自動でテンプレート再表示)
return super().form_invalid(form)
CRUD ジェネリックビュー
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Article
from .forms import ArticleForm
# 一覧
class ArticleListView(ListView):
model = Article
template_name = 'article/list.html' # デフォルト: <app>/<model>_list.html
context_object_name = 'articles' # デフォルト: object_list
paginate_by = 20 # ページネーション
def get_queryset(self):
qs = super().get_queryset()
return qs.filter(published=True).order_by('-created_at')
# 詳細
class ArticleDetailView(DetailView):
model = Article # URL に <pk> または <slug> 必要
# /articles/<int:pk>/ → object として渡される
# 新規作成
class ArticleCreateView(CreateView):
model = Article
form_class = ArticleForm
template_name = 'article/form.html'
success_url = reverse_lazy('article_list')
def form_valid(self, form):
form.instance.author = self.request.user # ログインユーザを著者に
return super().form_valid(form)
# 編集
class ArticleUpdateView(UpdateView):
model = Article
form_class = ArticleForm
template_name = 'article/form.html'
success_url = reverse_lazy('article_list')
# 削除
class ArticleDeleteView(DeleteView):
model = Article
template_name = 'article/confirm_delete.html'
success_url = reverse_lazy('article_list')
Mixin で機能追加
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
# ログイン必須
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
form_class = ArticleForm
login_url = '/login/' # 未ログイン時のリダイレクト先
# 作者本人のみ編集可
class ArticleUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Article
form_class = ArticleForm
def test_func(self):
article = self.get_object()
return self.request.user == article.author
カスタムメソッドのオーバーライドポイント
| メソッド | 用途 |
|---|---|
get_queryset() | 絞り込み・ソート |
get_context_data() | テンプレートに追加データを渡す |
get_object() | 取得する単一オブジェクトのカスタマイズ |
get_form_kwargs() | Form 初期化引数のカスタマイズ |
form_valid() / form_invalid() | バリデーション後の処理 |
dispatch() | すべてのリクエストの前処理 |
get_success_url() | 動的なリダイレクト先 |
dispatch() で共通処理
class MyView(View):
def dispatch(self, request, *args, **kwargs):
# GET / POST 共通の前処理
if not request.session.get('foo'):
return redirect('login')
return super().dispatch(request, *args, **kwargs)
def get(self, request):
...
def post(self, request):
...
URL での as_view() 引数
# 引数で属性をオーバーライド可能
urlpatterns = [
path('articles/', ArticleListView.as_view(paginate_by=10), name='list_10'),
path('news/', ArticleListView.as_view(paginate_by=50, template_name='news.html')),
]
関連
- RedirectView: シンプルなリダイレクト専用
- TemplateView: 静的テンプレート専用
- DRF の APIView / GenericAPIView: REST API 用
- django-extensions の show_urls: 全 URL とビューの一覧表示
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- クラスベースビュー(主流)の作り方とviewの分割
- 関数ベースビューの作り方とviewの分割
- URLディスパッチャー(ルーティング処理)
- GETとPOSTパラメータ受け取り
- クラスベースビューでGET/POSTリクエストの受け取り方
- クラスベースビューでテンプレートに値を渡す方法
- ビューでリダイレクト
- cookieの値の設定と取得
- HTTPステータスコードの返し方
人気ページ
- 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アノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?