考虑基本的Django形式:
from django import forms
class TestForm(forms.Form):
first_name = forms.CharField(max_length=50)
last_name = forms.CharField(max_length=50)
当您通过request.POST
形式的TestForm(request.POST)
表单时,它从请求的QueryDict
(s)接收form
实例:
from django.http.request import QueryDict
qd = QueryDict(mutable=True)
qd["first_name"] = "Brad"
qd["last_name"] = "Solomon"
TestForm(qd).is_valid()
# True
但是现在我想做的是处理这两个字段的多次类似行的重复:
<form method="POST" action="/some/endpoint">
<input type="text" name="first_name">
<input type="text" name="last_name">
<br>
<input type="text" name="first_name">
<input type="text" name="last_name">
<input type="submit" value="OK">
</form>
即
迭代访问这些已清洁和验证的(first_name
,last_name
)对中的每对的正确方法是什么?
如果我将整个内容传递给TestForm
,那么.cleaned_data
仅接受最近看过的一对:
>>> qd = QueryDict(mutable=True)
... qd.setlist("first_name", ["Brad", "Joe"])
... qd.setlist("last_name", ["Solomon", "Smith"])
>>> form = TestForm(qd)
>>> form.is_valid()
True
>>> form.cleaned_data
{'first_name': 'Joe', 'last_name': 'Smith'}
(对于价值而言,仅显示最后一个值是有意义的,因为这模仿了QueryDict
的行为。但是,我想访问所有值,而不仅仅是最后看到的值。)< / p>
答案 0 :(得分:2)
如果您不能使用表单集,则只需手动执行操作即可。
这里的大概想法是
def view(request):
# (add the usual `if method == POST` stuff here)
first_names = request.POST.getlist('first_name')
last_names = request.POST.getlist('last_name')
thingamabobs = request.POST.getlist('thingamabob')
for first_name, last_name, thingamabob in zip(first_names, last_names, thingamabobs):
f = NameForm(data={
'first_name': first_name,
'last_name': last_name,
'thingamabob': thingamabob,
})
if not f.is_valid:
# ... do something here
f.save() # or something
在未验证的情况下,将数据返回视图以重新填充POST后的字段,这在这里也很烦人。