Установка начального значения набора форм в мастере форм Django

В настоящее время я пытаюсь установить начальную переменную своего набора форм в мастере форм Django. Однако вместо того, чтобы устанавливать эти начальные переменные в начале процесса мастера форм, я хочу, чтобы они создавались динамически с использованием данных из предыдущего шага мастера форм.

Используя метод get_initial_form, я могу динамически устанавливать начальную переменную только первой формы в моем наборе форм. Я хотел бы динамически установить все формы в наборе форм. Это возможно?

VIEWS.PY

 class ContactWizard(SessionWizardView):
    def get_context_data(self, form, **kwargs):
            context = super(ContactWizard, self).get_context_data(form=form, **kwargs)
            if int(self.steps.current) == 1:
                    context.update({'foo': self.get_cleaned_data_for_step('0')})
            return context

    def get_form_initial(self, step, **kwargs):
            initial = self.initial_dict.get(step, {})
            if int(step) == 1:
                    form_class = self.form_list[step]
                    num_of_dates =  self.get_cleaned_data_for_step(str(int(step) - 1))['date'].split(',')
                    form_class.extra = len(num_of_dates)-1

                    initial.update({'slots': 4})
            return super(ContactWizard, self).get_form_initial(step)

    def get_template_names(self):
            return [TEMPLATES[self.steps.current]]

    def done(self, form_list, **kwargs):
            print 'testing'
            return HttpResponseRedirect('main/home.html')

URLS.PY

   url(r'^schedule/date/$', views.ContactWizard.as_view([ScheduleDate, formset_factory(ScheduleEventForm)]), name='schedule_date'),

FORMS.PY

 class ScheduleEventForm(forms.Form):
    time = forms.TimeField(label='Time', widget=forms.TextInput(attrs={'class': 'form-control time_entry_field'}))
    slots = forms.IntegerField(label='Slots', widget=forms.TextInput(attrs={'class': 'form-control slot_field'}))
    date = forms.CharField(label='', widget = forms.HiddenInput())
    class Meta:
            fields = ('time','slots')

person user2714604    schedule 12.10.2015    source источник


Ответы (1)


Я не уверен, что установка extra в get_form_initial - подходящее место для этого. Глядя на то, что вызывает get_form_initial, а именно get_form, вам может быть лучше установить extra в get_form_kwargs, поскольку возврат этого будет использоваться при генерации класса формы.

Я пришел к этому вопросу в поисках собственных ответов о том, как установить начальное значение для поля в наборе форм. Если я вообще попытаюсь обновить initial, у меня не будет начальных форм в наборе форм и произойдет сбой. Выполняя интерактивную отладку, вы почти как будто ожидаете, что initial будет списком dicts, по одному для каждой формы в наборе.

После некоторого дальнейшего исследования может показаться, что если вы хотите установить начальное значение для поля в наборе форм, вам необходимо передать обратно массив словарных статей с записью для каждого ожидаемого дополнения. На самом деле это похоже на поведение в BaseModelFormSet (см. _construct_form) и BaseFormSet, хотя BaseFormSet лучше справляется с ошибкой, если конкретная запись не может быть найдена (по крайней мере, для 1.10, во всяком случае).

Итак, как только вы определили свое значение extra, вам нужно заполнить список одним и тем же dict для такого количества записей, которое требуется для значения extra.

person Reuben    schedule 20.06.2017