考虑以下课程:
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,Form2
用于SessionWizardView
的第2步。
如果用户在步骤1中选中了Form2.checkbox_2
,我怎样才能在步骤2中停用Form2.checkbox_1
?
我试图通过覆盖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 :(得分: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 方法中,您可以在调用super之前弹出kwarg:
self.your_data = kwargs.pop('your_data', None)
并使用该值在表单上执行您需要的任何逻辑。
答案 1 :(得分:0)