URLによるデータの受け渡し

クエリパラメータを使う

helloアプリ内views.pyindex関数を書き換える。

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.GETGETは、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.pyindex関数側でこの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.pyindex関数内の記述を書き換えることで、helloアプリの処理を切り替えてきたが、このviews.pyが、名前が「ビュー」となっているものの、DjangoMVCにおける「コントローラ」である。

実際のMVCでの「ビュー」を受け持つのは、テンプレートだと考えてよい。