как получить доступ к данным формы в наборе форм django

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

####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() возвращает True

ОШИБКА

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

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

ПОЧТОВЫЕ ДАННЫЕ

form-0-action_name u'a'

форма-2-описание у'садса'

форма-0-описание u'a'

форма-MAX_NUM_FORMS u ''

форма-1-описание u'asd'

форма-TOTAL_FORMS u'3'

form-1-action_name u'as'

форма-INITIAL_FORMS u'0'

csrfmiddlewaretoken u'c4fa9ddb4ec69ac639d7801eb14979f2'

form-2-action_name u'asda'


person Rui Xia    schedule 25.12.2011    source источник


Ответы (2)


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

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

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

  • Обновление: я изначально думал, что наборы форм не имеют cleaned_data, но я думаю, они возвращают список очищенных_данных всех форм, что означает, что проблема с вашим кодом как раз выше.
person Yuji 'Tomita' Tomita    schedule 25.12.2011

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

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

if formset.is_valid():
    for form in formset: 
        customer.create_actiontype(form.action_name, form.description)
person Filip Dupanović    schedule 25.12.2011
comment
Это вызовет AttributeError, так как формы реализуют свои связанные поля не как атрибуты, а через индексирование элементов (form['action_name']), и, наконец, сами данные будут в cleaned_data dict. - person Yuji 'Tomita' Tomita; 26.12.2011