将表单数据重复到Django表单

时间:2019-06-06 17:40:24

标签: python django python-3.x django-forms

考虑基本的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>

enter image description here

迭代访问这些已清洁和验证的(first_namelast_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>

1 个答案:

答案 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后的字段,这在这里也很烦人。