как получить доступ к данным формы в форме набора Django - PullRequest
1 голос
/ 25 декабря 2011

У меня проблема с доступом к данным формы из набора форм.Я прикрепил код:

####FORM
class ActionTypeForm(forms.Form):
     action_name = models.CharField(max_length=20)
     description = models.CharField(max_length=250, blank=True, null=True)


####VIEW
dataset = request.POST
ActionTypeFormSet = formset_factory(ActionTypeForm)
formset = ActionTypeFormSet(dataset)

if formset.is_valid():
     for form in formset.cleaned_data:  #I ALSO TESETED formset.forms
           customer.create_actiontype(form['action_name'], form['description'])

ошибка в том, что я не могу получить форму ['action_name'].formset.is_valid () return True

ERROR

Тип исключения: KeyError

Значение исключения: 'action_name'

POST DATA

form-0-action_name u'a '

form-2-description u'sadsa'

form-0-description u'a '

form-MAX_NUM_FORMS u''

form-1-description u'asd'

form-TOTAL_FORMS u'3 '

form-1-action_name u'as'

form-INITIAL_FORMS u'0 '

csrfmiddlewaretoken u'c4fa9ddb4ec69ac639d7801eb14979f2'

form-2-action_name u'asda '

Ответы [ 2 ]

2 голосов
/ 25 декабря 2011

Основная проблема в том, что у вас есть бланк. Вы используете модельные поля в своем определении класса формы, с которым фреймворк форм django понятия не имеет, что делать. Джанго модели! = Джанго формы.

Formset проверяет и возвращает пустые формы, которые, конечно, не имеют полей формы.

Вам следует либо создать Formset s из форм с действительными полями формы, либо ModelFormset s из Model s.

  • Обновление: я изначально думал, что наборы форм не имеют cleaned_data, но я предполагаю, что они возвращают список cleaned_datas всех форм, что означает, что проблема с вашим кодом только что описана выше.
0 голосов
/ 25 декабря 2011

В наборе форм хранятся все связанные с ним формы в self.forms, и повторение по нему возвращает итератор iter(self.forms) для форм.

Ваши POST данные выглядят хорошо, поэтому вы можете заставить их работать так:

if formset.is_valid():
    for form in formset: 
        customer.create_actiontype(form.action_name, form.description)
...