| この記事の要点 |
|
Django の関数ベースビュー(FBV)で、GET パラメータと POST パラメータを受け取る方法をまとめます。クラスベースビューでの受け取り方は関連する別記事を参照してください。
GET
val1 = request.GET['val1']
http://localhost:8000/search/?val1=abc にアクセスすると、val1 に文字列 "abc" が入ります。
POST
val1 = request.POST['val1']
フォームの <input name="val1"> に入力された値が入ります。name 属性の値がキーになります。
実践的な書き方(キーがない場合に備える)
request.GET / request.POST は QueryDict という辞書に似たオブジェクトです。[] で存在しないキーを指定すると MultiValueDictKeyError が発生するため、実際には get() で既定値を指定するのが定番です。
from django.shortcuts import render
def search(request):
keyword = request.GET.get('q', '') # なければ空文字
page = request.GET.get('page', '1') # 値は常に文字列
try:
page = int(page)
except ValueError:
page = 1
return render(request, 'search.html', {'keyword': keyword, 'page': page})
GET と POST を 1 つのビューで処理する
from django.shortcuts import render, redirect
def contact(request):
if request.method == 'POST':
name = request.POST.get('name', '').strip()
message = request.POST.get('message', '').strip()
if not name:
return render(request, 'contact.html', {'error': '名前は必須です'})
# 保存やメール送信などの処理
return redirect('contact_done') # 二重送信防止のためリダイレクト
return render(request, 'contact.html')
<form method="post" action="">
{% csrf_token %}
<input type="text" name="name">
<textarea name="message"></textarea>
<button type="submit">送信</button>
</form>
複数の値を受け取る(getlist)
チェックボックスや ?tag=a&tag=b のように同じ名前の値が複数送られる場合、get() は最後の 1 つしか返しません。全部受け取るには getlist() を使います。
tags = request.GET.getlist('tag') # ['a', 'b']
colors = request.POST.getlist('color') # 未選択なら []
受け取り方の早見表
| 送られ方 | 受け取り方 |
|---|---|
URL のクエリ文字列 ?key=value | request.GET.get('key') |
| HTML フォームの POST | request.POST.get('key') |
| 同じキーで複数の値 | request.GET.getlist('key') / request.POST.getlist('key') |
| JSON 本文(fetch / Ajax) | json.loads(request.body) |
ファイル(enctype="multipart/form-data") | request.FILES.get('key') |
URL のパスの一部 /items/5/ | urls.py の path('items/<int:item_id>/', ...) で定義し、ビューの引数 item_id で受け取る |
JSON を受け取る例
import json
from django.http import JsonResponse
def api_create(request):
if request.method != 'POST':
return JsonResponse({'error': 'POST only'}, status=405)
try:
data = json.loads(request.body)
except json.JSONDecodeError:
return JsonResponse({'error': 'invalid JSON'}, status=400)
name = data.get('name')
return JsonResponse({'name': name})
よくある落とし穴
MultiValueDictKeyError:[]で存在しないキーを読んだ。フォームのname属性のつづり違いや、未選択のチェックボックス(値が送信されない)が典型。get()を使う- 403 CSRF verification failed: POST フォームに
{% csrf_token %}がない、または Ajax で CSRF トークンをヘッダーに付けていない - POST なのに
request.POSTが空: 送信側が JSON(Content-Type: application/json)で送っている。request.bodyを読む - 値が文字列:
"10"と10は別物。比較や計算の前にint()などで変換し、変換失敗に備える - QueryDict は変更できない:
request.GET['x'] = 'y'はエラー。変更したいならrequest.GET.copy()で複製する - 入力チェックを手書きしすぎない: 項目が多いなら Django の Form クラス(
forms.Form)を使うと、型変換・必須チェック・エラー表示をまとめて扱える
確認方法
- ビューの中で
print(request.method, request.GET, request.POST)を一時的に書くと、runserver を動かしている端末に受け取った内容が表示される - ブラウザの開発者ツールの「ネットワーク」タブで、実際に送られたパラメータ(クエリ文字列・フォームデータ・JSON)を確認する
関連
- Django「MultiValueDictKeyError」原因と対処
- Forbidden (403) CSRF verification failed. Request aborted.
- Django + Ajax POST 通信完全ガイド
- Python 辞書のキー存在チェック
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09