2012-05-29 79 views
1

考虑以下类:修改表单字段

models.py:

class Data(models.Model): 
    first_name = models.CharField() 
    checkbox_1 = models.BooleanField() 
    checkbox_2 = models.BooleanField() 

forms.py:

class Form1(ModelForm): 
    class Meta: 
     model = Data 
     fields = ('first_name', 'checkbox_1',) 

class Form2(ModelForm): 
    class Meta: 
     model = Data 
     fields = ('checkbox_2',) 

Form1在步骤1中被使用和在SessionWizardView的步骤2中使用Form2

如果用户在步骤1中检查了Form2.checkbox_1,我怎么能在步骤2中禁用Form2.checkbox_2

我试图通过覆盖get_form()没有成功做到这一点:

def get_form(self, step=None, data=None, files=None): 
    form = super(MyWizard, self).get_form(step, data, files) 
    if step == '1': 
     form.fields['checkbox_2'].widget.attrs['disabled'] = 'disabled' 
    return form 

请注意,我故意没有检查的Form2.checkbox_1值。我试图在任何情况下设置小部件的属性。

+0

Wizrd为每个步骤都有单独的表单,那么为什么您需要根据当前步骤更改某些内容,而不是仅为该步骤提供正确的表单? – ilvar

+0

我更新了问题,突出显示了我需要根据上一步的值更改表单字段的属性。 – mbaechtold

回答

2

我通过重写了WizardView get_form_kwargs解决了这个。它通常只是返回一个get_form填充的空字典,所以通过覆盖它来返回一个需要预填充数据的字典,可以将kwargs传递给您的表单init。

def get_form_kwargs(self, step=None): 
    kwargs = {} 
    if step == '1': 
     your_data = self.get_cleaned_data_for_step('0')['your_data'] 
     kwargs.update({'your_data': your_data,}) 
    return kwargs 

然后,在你的形式的init方法,你可以只调用超之前弹出kwarg关:

self.your_data = kwargs.pop('your_data', None) 

,并使用该值来执行,你需要什么逻辑形式。