1

次のクラスを検討してください。

models.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 が入力する空の辞書を返すだけなので、事前入力が必要なデータを含む辞書を返すようにオーバーライドすることで、フォームの init に kwargs を渡すことができます。

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)

その値を使用して、フォームで必要なロジックを実行します。

于 2012-10-26T00:38:16.553 に答える