| この記事の要点 |
|
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 / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38