0

オプションですが、ユーザーに関連付ける必要がある複数のフォーム フィールドを渡しています。Python の cgi.FormDict と cgi.FieldStorage はどちらも空白のエントリを削除するため、項目が「上」に移動し、間違ったユーザーに関連付けられます。

この問題はほとんどの場合、チェックボックス (私が持っています) で発生しますが、テキスト フィールドもあります。

簡略化されたフォーム コード:

<input type="text" name="user" />
<input type="text" name="email" />
<input type="text" name="phone" />
<input type="checkbox" value="MailingList1" />
<input type="checkbox" value="MailingList2" />
<p>
<input type="text" name="user" />
<input type="text" name="email" />
<input type="text" name="phone" />
<input type="checkbox" value="MailingList1" />
<input type="checkbox" value="MailingList2" />
etc...

ユーザーは、電子メールまたは電話のいずれか (または両方) を入力する必要がありますが、もう一方は空白のままにすることができます。

次のような入力があるとします。

john_doe         john_doe@example.com        (123) 555-1234    Y    Y
jane_roe         jane_roe@example.com                          Y
george_jetson    george_jetson@future.com    (321) 555-4321         Y

FormDict は次のようになります。

{
'username':['john_doe','jane_roe','george_jetson'],
'email':['john_doe@example.com','jane_roe@example.com','george_jetson@future.com'],
'phone':['(123) 555-1234','(321) 555-4321'],
'MailingList1':['Y','Y'],
'MailingList2':['Y','Y']
}

私はこのようにループしています:

for i in range(len(myFormDict['username'])):
    username = myFormDict['username'][i]
    email = myFormDict['email'][i]
    phone = myFormDict['phone'][i]
    MailingList1 = myFormDict['MailingList1'][i]
    MailingList2 = myFormDict['MailingList2'][i]

    ...Inserts into the database

質問する前に、「はい、リストの末尾からはみ出すのを防ぐエラー トラップがあります。」コードは正常に動作しますが、データベースは次のようになります。

john_doe         john_doe@example.com        (123) 555-1234    Y    Y
jane_roe         jane_roe@example.com        (321) 555-4321    Y    Y
george_jetson    george_jetson@future.com

ジェーンとジョージは私にかなり怒るだろう.

では...どうすれば空欄のままにして、適切な電話番号とリスト メンバーシップが適切なユーザーと一致するようにできるのでしょうか?

Web を検索して見つけたすべての回答には、GAE、Django、Tornado、Bottle などのフレームワークが含まれています。

ボトルは最軽量ですが、試してみましたが、Python 2.5 が必要で、2.4 にこだわっています。

これらのフレームワークでそれができるなら、それは可能でなければなりません。では、標準ライブラリだけでデータを適切に管理するにはどうすればよいでしょうか?

ありがとう。

4

3 に答える 3

2

以下のドキュメント(つまり、keep_blank_valuesパラメータ)を見てください。

>>> print cgi.FieldStorage.__init__.__doc__
Constructor.  Read multipart/* until last part.

        Arguments, all optional:

        fp              : file pointer; default: sys.stdin
            (not used when the request method is GET)

        headers         : header dictionary-like object; default:
            taken from environ as per CGI spec

        outerboundary   : terminating multipart boundary
            (for internal use only)

        environ         : environment dictionary; default: os.environ

        keep_blank_values: flag indicating whether blank values in
            percent-encoded forms should be treated as blank strings.
            A true value indicates that blanks should be retained as
            blank strings.  The default false value indicates that
            blank values are to be ignored and treated as if they were
            not included.

        strict_parsing: flag indicating what to do with parsing errors.
            If false (the default), errors are silently ignored.
            If true, errors raise a ValueError exception.
于 2013-03-07T09:38:15.383 に答える
0

cgi.FromDict を微調整して希望どおりにできるかどうかはわかりませんが、次のようにすべての入力セットを一意にすることが解決策になるかもしれません。

<input type="text" name="user" />
<input type="text" name="email" />
<input type="text" name="phone" />
<input type="checkbox" value="MailingList1_1" />
<input type="checkbox" value="MailingList2_1" />
<p>
<input type="text" name="user" />
<input type="text" name="email" />
<input type="text" name="phone" />
<input type="checkbox" value="MailingList1_2" />
<input type="checkbox" value="MailingList2_2" />

MailingList1 と Mailinglist2 には、「エントリ ブロック」の接尾辞が付いていることに注意してください。

フォームの生成時にこれを追加し、次のようにチェックボックスを読んでそれに応じて処理を適応させる必要があります。

lv_key = 'MailingList1_' + str(i)
MailingList1 = myFormDict[lv_key]
...

よろしく、

マーティン

于 2013-03-07T09:31:13.973 に答える
0

django や bottle などの wsgi ベースのフレームワークを使用している場合でも、<input>各フィールドに同じ名前を使用しています。cgi formdict は空のフィールドを削除しません。そもそも空のフィールドはありません。ユーザーごとに異なる名前属性を指定する必要があります。

于 2013-03-07T09:35:13.777 に答える