URLによるデータの受け渡し
クエリパラメータを使う
hello
アプリ内views.py
のindex関数
を書き換える。
def index(request): msg = request.GET['msg'] return HttpResponse('you typed: "' + msg + '".')
http://localhost:8000/hello/?msg=hello
にアクセスすると,
you typed: "hello".
と表示される。
クエリパラメータが無いURLへの対応
しかしこの状態でクエリパラメータ無しのURLでアクセスすると、例えばhttp://localhost:8000/hello/
にアクセスすると、
MultiValueDictKeyError at /hello/というエラーが表示される。そこでURLによって表示結果を分岐する必要がある。素朴な方法だが、if
文で、辞書型データになっているrequest.GET
の中にmsg
というキーが存在するかどうかをチェックさせる。
def index(request): if 'msg' in request.GET: msg = request.GET['msg'] result = 'you typed: "' + msg + '".' else: result = 'please send msg parameter!'
これでhttp://localhost:8000/hello/
へのアクセスの場合は、
please send msg parameter!
と表示される。
QueryDict
request.GET
のGET
は、HttpRequest
のプロパティで、QueryDict
クラスのインスタンスを保持している。QueryDict
クラスは、分解したクエリパラメータのテキストを辞書型データで管理する。
QueryDict('a=foo&b=bar'&...)
という形でクエリパラメータの文字列を引数に渡すと、{"a":"foo", "b":"bar", ...}
という形でパラメータが保持される。
GET['msg']
とすることで'msg'をキーとするクエリパラメータの値を取得できる。
urlpatterns を使ったデータのやり取り
クエリパラメータを多用するデータのやり取りは、URLが汚れてスマートではない。urlpatterns
に埋め込まれたパラメータを取得する方法のほうがスマートだ。
hello/urls.py
を修正する。
urlpatterns = [ path('<int:id>/<nickname>', views.index, name='index'),
hello/views.py
のindex関数
側でこのURLパターン中のパラメータを受け取る。
def index(request, id, nickname): result = 'your id: ' + str(id) + ', name: "' + nickname + '".' return HttpResponse(result)
これで例えばhttp://localhost:8000/hello/123/foo
にアクセスすると、
your id: 123, name: "foo".
が表示される。
urlpatterns
の中に<name>
という書き方をした場合は、そのname
という変数名で値を受け取ることができる。アドレスで設定される値は通常テキストなのでそのままテキストとして渡されるが、この場合のid
のように数値として受け取りたい場合は、<int:id>
というふうに int型といったデータ型を指定する。
views.py
はコントローラ
hello/views.py
のindex関数
内の記述を書き換えることで、helloアプリの処理を切り替えてきたが、このviews.py
が、名前が「ビュー」となっているものの、DjangoのMVCにおける「コントローラ」である。
実際のMVCでの「ビュー」を受け持つのは、テンプレートだと考えてよい。