フォームから送信した値と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
Tags: 
Django
Python
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"]

で常に一番最後のモノを取得できます

Created at: 
2007/06/28 15:15:19

nobu

ツッコミありがとうございます!勉強になりました。
さっそくエントリーにも追記しておきました!

Created at: 
2007/06/28 22:49:35

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ページ目を指定するようにしてます。

Created at: 
2007/06/28 23:46:40

nobu

コメントありがとうございます!

やっぱりその時々での使い分けは必要なんですね。
今までget()を使って、必ずデフォルト値を設定する方法で書いてました。

「keyがあった時のみ処理する。」みたいな時はhas_key()を使って処理を分岐した方が良いですね。

PythonもDjangoもまだまだ知らない事がたくさんです。

Created at: 
2007/06/29 01:04:37

Add Comment

Add Comment