Повторные данные формы в форму Django - PullRequest
0 голосов
/ 06 июня 2019

Рассмотрим базовую форму Джанго:

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 из запросов form (s):

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>

* 1014 Т.е. *

enter image description here

Как правильно перебрать каждую из этих очищенных и проверенных (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. Однако я хотел бы получить доступ ко всем значениям, а не только к последним увиденным.)

1 Ответ

2 голосов
/ 06 июня 2019

Если вы не можете использовать набор форм, вам просто нужно будет что-то делать вручную.

Грубая идея здесь

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, если вещи, которые не проверяются, также будут немного раздражать.

...