【问题标题】:Setting Formset Initial Within a Django Formwizard在 Django Formwizard 中设置 Formset Initial
【发布时间】:2016-01-09 10:05:44
【问题描述】:

我目前正在尝试在 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')

【问题讨论】:

    标签: python django formset django-formwizard


    【解决方案1】:

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

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

    经过进一步调查,似乎如果您想为表单集中的字段设置首字母,您需要传回一个字典数组,其中每个预期的额外条目都有一个条目。这实际上似乎是BaseModelFormSet(请参阅_construct_form)和BaseFormSet 中的一种行为,尽管BaseFormSet 在找不到特定条目时会更好地处理错误(至少对于1.10,无论如何)。

    因此,一旦您确定了您的 extra 值,您需要为 extra 值所需的尽可能多的条目填充一个具有相同字典的列表。

    【讨论】:

      猜你喜欢
      • 2014-08-08
      • 2019-09-29
      • 2011-09-04
      • 2011-07-22
      • 2013-02-28
      • 1970-01-01
      • 2013-01-25
      • 2012-03-09
      • 2019-06-02
      相关资源
      最近更新 更多