ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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' # デフォルト: /_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 に または 必要
# /articles// → 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アノテーションとは
最近更新/作成されたページ
- Struts1 の ActionForm とは? validate() / reset() / DynaActionForm の使い分け 2026-05-16 17:19:31
- PC の最大メモリ容量を確認する方法(Windows wmic / PowerShell, Linux dmidecode / lshw) 2026-05-16 17:19:31
- Eclipse で Tomcat を起動するボタンを出す手順(Servers ビュー + サーバー登録) 2026-05-16 17:19:31
- Tomcat の AutoDeploy 設定(autoDeploy / unpackWARs / deployOnStartup の意味と本番運用) 2026-05-16 17:19:31
- ポリモーフィズム(多様性)とは何か? Java / C++ コード例と OCP・拡張性の理由 2026-05-16 17:19:31
- <head> の内容が <body> に移動する原因と対処(HTML5 パーサのエラー復旧) 2026-05-16 17:19:31
- Amazon PA-API 5.0 の AWS V4 署名を PHP で生成(SDK 利用 / 自前 hash_hmac 両方) 2026-05-16 17:19:31
- Amazon PA-API 5.0 リクエスト構造(SearchItems / GetItems / GetVariations と Resources 指定) 2026-05-16 17:19:31
- Maven / Ant / Gradle で "Missing target argument" が出る原因と対処(goal / target 指定) 2026-05-16 17:19:31
- Struts1 の ActionMapping とは? <action> 定義・ActionForward・findForward の使い方 2026-05-16 17:19:31
- Apache / Nginx でドキュメントルートを変更する手順(Laravel public/ への切替も) 2026-05-16 17:19:26
- cron / crontab の書き方完全ガイド(書式・@reboot・環境変数・systemd timer 比較) 2026-05-16 17:19:26
- DB トランザクション完全ガイド(SQL BEGIN/COMMIT / Laravel / Spring / 分離レベル / デッドロック) 2026-05-16 17:19:26
- .env の値を取り出す方法(Laravel env / config / Node.js dotenv / PHP phpdotenv) 2026-05-16 17:19:26
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / route:clear / view:clear / OPcache) 2026-05-16 17:19:26
コメントを削除してもよろしいでしょうか?