フォームから送信した値とrequest.POSTの挙動($_POST@PHPとの比較)
LinuxなWEBデザイナーの覚書き。 の コチラ のエントリーより。
これ、自分も Django 使い始めた時に結構ハマった記憶があるなぁ。って事で、自分のためにメモ。
テンプレートはこんな感じ。(パクリ)
<form action="." method="post">
<input type="checkbox" name="text" value="hoge" checked="checked" />
<input type="checkbox" name="text" value="hage" checked="checked" />
<input type="checkbox" name="text" value="mage" checked="checked" />
<input type="submit" value="submit" />
</form>
test な名前の値を全部取る場合なら、
l = request.POST.getlist('test')
でどうでしょう? オリジナルのデータを弄らないようにするなら、
l = request.POST.copy().getlist('test')
の方が良いと思う。
PHP の $_POST みたいな感じで最後のモノだけ取りたい場合は、
l = request.POST.copy().getlist('test')
l.reverse()
l = l[0]
とかになるのかな?ちょっと苦しいかも。もっとキレイな書き方があるかも知れない。
以下追記
uemura さんよりツッコミを頂きました。ありがとうございます!
QueryDict は受け取った順番を保持していて、普通に抜き取ると最後のものを返してくれるそう。って事で実験してみた。
l = request.POST['test']
return HttpResponse(l, mimetype='text/plain; charset=utf-8')
おお!ちゃんと mage って返ってきてる。なるほど。って事は以下でも可。
l = request.POST.copy().get('test')
return HttpResponse(l, mimetype='text/plain; charset=utf-8')
うむ。出来た出来た。
また一つ勉強になりました!
- Posted at:
- 2007/06/27 23:47:54
- 4 Comments
- 0 TrackBacks
- Trackback:
- http://humming.via-kitchen.com/2007/06/27/comparison-between-django-and-php-of-request-post/trackback/
TrackBacks
まだ登録されていません。
Comments
uemura
QueryDictは受け取った順番を保持し、最後のものを返すので
普通に
if request.POST.has_key("text"):
l = request.POST["text"]
で常に一番最後のモノを取得できます
nobu
ツッコミありがとうございます!勉強になりました。
さっそくエントリーにも追記しておきました!
uemura
先ほどコメント書いたuemuraです。
早速エントリーに反映させてもらってありがとうございます!
getはpythonの辞書型のメソッドで、第一引数に指定したkeyが無い場合に第二引数に指定したデフォルトの値を返すものです(指定しない場合はNone)
>>> dic={}
>>> print dic["hoge"]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
KeyError: 'hoge'
>>> print dic.get("hoge")
None
>>> print dic.get("hoge", "default")
default
なのでkeyが無い場合どうするか?によってl=request.POST.get("text")とif request.POST.has_key("text"):l=request.POST["text"]を使い分けする必要があります。
例えば汎用ビューのobject_listのpagenateは内部でrequest.GET.get("page", 1)とやって、?page=2などの指定が無い場合は1ページ目を指定するようにしてます。
nobu
コメントありがとうございます!
やっぱりその時々での使い分けは必要なんですね。
今までget()を使って、必ずデフォルト値を設定する方法で書いてました。
「keyがあった時のみ処理する。」みたいな時はhas_key()を使って処理を分岐した方が良いですね。
PythonもDjangoもまだまだ知らない事がたくさんです。