Django窗体向导在步骤之间的持续初始数据

问题描述:

我在项目中使用Django Form Wizard。我希望允许用户为特定领域提供初始数据,并且还希望使用提供的初始数据禁用的字段。Django窗体向导在步骤之间的持续初始数据

问题是,当用户点击后退按钮时,初始数据被删除。

例如,这是我的形式(初始数据被设定为第二步骤) enter image description here 正如你可以看到一切都很好这里,表单字段将被禁用,并且选择的值。现在我们点击next

enter image description here 我们点击next,我们得到没有问题的第二个步骤,但如果我现在点击back .. enter image description here

表单域仍然禁止,但值了!

我正在使用的代码是这样的(相关部分):

CHOICES=[('ONE','Choice 1'), 
     ('TWO','Choice 2'), 
     ('THREE','Choice 3'), 
     ('FOUR','Choice 4'), 
     ] 

class BookingForm1(forms.Form): 
    """ Select reservation type""" 
    sko = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect()) 

向导

def get_form(self, step=None, data=None, files=None): 
     form = super(PresentView, self).get_form(step, data, files) 
     step = step or self.steps.current 

     initial = { 
      'sko': { 
       'initial':'TWO' 
      } 
     } 

     for field in initial: 
      try: 
       form.fields[field].widget.attrs['readonly'] = True 
       form.fields[field].widget.attrs['disabled'] = True 
       form.fields[field].required = False 
       form.fields[field].initial = initial[field]['initial'] 
      except: 
       pass 

任何想法,将不胜感激!

+0

我没有为您解决问题,但下面解释了为什么它不起作用:当您禁用该字段时,这意味着浏览器不会将该值提交给服务器。当你回到原始表单时,表单被绑定,所以Django使用了表单数据并忽略了“初始”数据。但是,表单数据不包含禁用字段的值,因此表单呈现时没有选择任何值。 – Alasdair

我能够解决这个问题的方法是删除ChoiceField类型对象的额外字段。

for field in initial: 
      try: 
       field_o = form.fields[field] 
       # Remove extra choices if Choice field 
       if type(field_o) == forms.fields.ChoiceField: 
        field_o.choices = [(key, value) for key,value in field_o.choices if key == initial[field]['initial']] 
       else: 
        field_o.widget.attrs['readonly'] = True 

       field_o.initial = initial[field]['initial'] 
      except: 
       pass