今回は、GETリクエストでViewに値を送る方法について記述する。
HTTPメソッドのGETで値を送る。
方法は主に2つあるのでそれぞれ記述する
?var1=value1&var2=value2で送る方法
この場合、viewで以下のようにGETメソッドでリクエストが送られてきた想定でView側のコードを作成する
- view.pyの記述内容(request.GETから取得)
def index(request):
msg = ''
if 'msg' in request.GET: # requst.GET内にmsgが含まれているかどうか確認する。urlに?msg=○○とあるときに、msgに対応した○○の値を取得できる
msg = request.GET['msg'] # msg=hogeの場合、hogeを取得して変数msgに格納する
return HttpResponse(f'Your message: {msg}') # Your message: {msg}を画面に表示
- これで、下のように?msg=hogeとurlを指定してアクセスした場合、画面にYour message: hogeと表示される
- もしmsgを指定しなかった場合、view内でmsgに値が格納されず画面にはYour message:のみ表示される。
また、GETで渡される値は、型が文字列型(str)になる
例えば以下のような場合、文字列と数値の計算になり、計算ができないためエラーが発生する
- views.py
def index(request):
num = ''
if 'num' in request.GET:
num = request.GET['num'] # requestからnum=○○の値を取得
print(type(num)) # str
sum = num + 1 # str + intとなりエラー
return HttpResponse(f'{num} + 1 = {sum}')
- http://127.0.0.1:8000/app1/index/?num=12でアクセスし、TypeErrorとなる例
この場合、以下のように修正する。
- views.py(修正版)
def index(request):
num = ''
if 'num' in request.GET:
num = request.GET['num']
print(type(num)) # str
sum = int(num) + 1 # int + intとなる
return HttpResponse(f'{num} + 1 = {sum}') # num + 1 = sumと画面に表示される
- 修正後num=1としてアクセスした結果
urlパターンマッチングで値を送る方法(http://○○○/○○/××とする)
これは、urlに?○○=○○と書かずに、/○○/××と記述してGETリクエストで送るやり方を言う。
これには、urls.pyとview.pyそれぞれ修正する必要がある。
- urls.pyでURLパターンマッチングを指定する
from app1 import views
app_name = 'app1'
urlpatterns = [
path('index/<str:msg>/<int:num>', views.index, name='index'),
# GETで送信するパラメータとしてmsgとnumを指定する。この場合、msgはstrで、numはintで渡される
]
次に、views.pyを修正する
- views.pyでGETリクエストを取得
def index(request, msg, num): # GETで取得するパラメータとしてmsgとnumを指定
result = f"{msg} = {num} years old"
return HttpResponse(result)
これで例えば
http://127.0.0.1:8000/app1/index/Taro/12
とアクセスすると、"Taro = 12 years old"と画面には表示される
- 実行結果