我目前正在尝试在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')
答案 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的列表。