在Django Formwizard中设置Formset Initial

时间:2015-10-12 02:39:16

标签: python django formset django-formwizard

我目前正在尝试在Django formwizard中设置我的formset的初始变量。但是,我不希望在表单向导过程的开头设置这些初始变量,而是希望使用表单向导中上一步的数据动态创建它们。

使用get_initial_form方法,我能够动态设置我的formset中第一个表单的初始变量。我想动态设置formset中的所有表单。这可能吗?

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')

1 个答案:

答案 0 :(得分:0)

我不确定在extra中设置get_form_initial是否适合这样做。查看调用get_form_initial的内容,即get_form,您可能最好在extra中设置get_form_kwargs,因为返回它将用于生成表单类

我来自这个问题,寻找自己的答案,了解如何为formset中的字段设置初始值。如果我尝试更新initial,我最终在formset中没有初始表单并且崩溃。进行交互式调试时,几乎就像期望initial成为一个dicts列表,每个表单对应一个。

经过一些进一步的调查后,似乎如果你想为一个formset中的一个字段设置一个初始值,你需要传回一个dicts数组,每个预期额外的一个条目。这实际上似乎是BaseModelFormSet(请参阅_construct_form)和BaseFormSet中的行为,但如果无法找到特定条目,则BaseFormSet会更好地处理错误(至少对于1.10,无论如何)。

因此,一旦确定了extra值,就需要根据extra值的要求填充具有相同dict的列表。