Django Post リクエスト取得時に 'WSGIRequest' object is not subscriptable が発生する


Class based Viewpost 送信された値を受け取り、
Form を生成しようとしたところ、エラーが発生したので、
対処方法を記録します。

参考サイト


エラーと修正内容

  • ダメな記述抜粋
    # Form を再生成する
    form = SelectViewForm(request['tool_choice'])

request に詰まった値を取得しようとして書いたつもりですが、
下記のエラーが発生しました。

  • エラー内容
    'WSGIRequest' object is not subscriptable
  • 修正内容

request['tool_choice'] ではなく、
request.POST['tool_choice']と記載しないといけないだけだったので、
以下のように記載して、正常に動作しました。

    form = SelectViewForm(request.POST['tool_choice'])

体系的な学習もせず、いきあたりばったりで実装していくと、
思わぬどうしようもないところで、
エラーになりますね。。


補足 追記(2017/07/17)

そもそも WSGIRequest について

そもそも、WSGIRequest がなんなのかよくわかってなかったですが、
django/wsgi.py at master · django/django
にクラスは定義されています。
リクエストとレスポンスのオブジェクト | Django documentation | Django
あたりにも、一文字も登場しないのですが、wsgi.py を使う限りは基本的に、HTTPRequest の実体はWSGIRequest になるのかと思われます。
wsgi については、以下の記事がわかりやすかったです。
WSGIからDjangoの流れを理解する - Make組ブログ(移行して http://blog.hirokiky.org/ にあるよ)

object is not subscriptable について

エラーメッセージ中の、subscriptable についてですが、
以下、記事を見る限り、Taple とか、List オブジェクトではないので、添字アクセスはできない場合発生するエラーのようです。
【Python】式(1,2)は丸括弧がタプルを作っているわけではない - Qiita
__getitem__ が実装されてないから、このエラーになると理解しました。

Wicket もそうですが、というか言語問わずで、
WebアプリケーションでFormを使うとなった時点で考慮事項一気に増えるなと、
久しぶりに書いて思いました。
以上です。

コメント