1

考虑以下类:

模型.py:

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

表格.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用于 a 的步骤 2 SessionWizardView

Form2.checkbox_2如果用户在步骤 1 中签入,我如何在步骤 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. 无论如何,我都尝试设置小部件的属性。

4

2 回答 2

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)

并使用该值在表单上执行您需要的任何逻辑。

于 2012-10-26T00:38:16.553 回答