2012-05-29 108 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) 

,並使用該值來執行,你需要什麼邏輯形式。