1

データを取得し、html ドキュメントに入力してメールで送信する長い html フォームがあります。form = cgi.FieldStorage() を使用して、フォームから投稿されたデータを取得しています。次に、メッセージ本文に似た文字列があります(ただし、それよりもはるかに長い)

 msg = """<html><p>%(Frist_Name)s</p><p>%(Last_Name)s</p></html> """ % form

デバッグによると、フォームで送信されなかった私の名前付き変数の1つが見つかるまで機能します。

フォームには多くのオプション フィールドがあります。事前にすべてのフィールドを収集し (つまり、各フィールドを手動で再入力する) 必要がないように、これを機能させるか、同様のことを行うにはどうすればよいですか? それとも、正確にそれを行うより簡単な方法はありませんか?

4

1 に答える 1

2

デフォルトを設定する

my_data_dict = {'first_name':'','last_name':'','blah':'','something_else':''} #defaults with all values from format string
my_data_dict.update(form) #replace any values we got
 msg = """<html><p>%(Frist_Name)s</p><p>%(Last_Name)s</p></html> """ % my_data_dict

またはデフォルトの辞書を使用します(この方法では、すべてのデフォルトを入力する必要がなくなり、魔法のように「」になります)

from collections import defaultdict
my_dict = defaultdict(str)
print my_dict['some_key_that_doesnt_exist']  #should print empty string
my_dict.update(form)
msg = """<html><p>%(Frist_Name)s</p><p>%(Last_Name)s</p></html> """ % my_data_dict

または abarnert が指摘しているように、次のように単純化できます

from collections import defaultdict
my_dict = defaultdict(str,form)
msg = """<html><p>%(Frist_Name)s</p><p>%(Last_Name)s</p></html> """ % my_dict

これは、端末で行った完全な例です

>>> d = defaultdict(str,{'fname':'bob','lname':'smith','zipcode':11111})
>>> format_str = "Name: %(fname)s  %(lname)s\nPhone: %(telephone)s\nZipcode: %(z
ipcode)s"
>>> d
defaultdict(<type 'str'>, {'lname': 'smith', 'zipcode': 11111, 'fname': 'bob'})
>>> #notice no telephone here
...
>>> d['extra_unneeded_argument'] =' just for show'
>>> d
defaultdict(<type 'str'>, {'lname': 'smith', 'extra_unneeded_argument': ' just f
or show', 'zipcode': 11111, 'fname': 'bob'})
>>> print format_str%d
Name: bob  smith
Phone:
Zipcode: 11111
于 2013-05-06T18:53:16.197 に答える