我正在传递多个表单字段,这些字段是可选的,但需要与用户关联。 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...
用户需要输入EITHER电子邮件或电话(或两者),但可以将其他用户留空。
现在说我有这样的输入:
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
简和乔治会对我很生气。
那么......我如何保留空白,以便正确的用户排列正确的电话号码和列表会员资格?
我在网上搜索的所有答案都涉及GAE,Django,Tornado,Bottle等框架。
瓶子重量最轻,但是我尝试了它,它需要Python 2.5而且我坚持2.4。
如果这些框架可以做到,那就必须有可能。那么如何仅使用标准库来正确管理数据呢?
感谢。
答案 0 :(得分: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.
答案 1 :(得分: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的后缀为“输入块”。
您必须在Form的生成时间添加此内容,然后通过阅读如下所示的复选框来相应地调整您的处理:
lv_key = 'MailingList1_' + str(i)
MailingList1 = myFormDict[lv_key]
...
此致
马丁
答案 2 :(得分:0)
即使您使用基于wsgi的框架(如django或bottle),您也会为每个字段使用相同的<input>
名称 - cgi formdict不会消除空字段,首先没有空字段。你应该为每个用户提供不同的名称属性。