Изменение полей формы в FormWizard (Django 1.4)

Рассмотрим следующие классы:

модели.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 используется на шаге 2 SessionWizardView.

Как я могу отключить Form2.checkbox_2 на шаге 2, если пользователь отметил Form2.checkbox_1 на шаге 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. Я пытался установить атрибуты виджета в любом случае.


person mbaechtold    schedule 29.05.2012    source источник
comment
В Wizrd есть отдельные формы для каждого шага, так зачем вам что-то менять на основе текущего шага, а не просто предоставлять правильную форму для этого шага?   -  person ilvar    schedule 29.05.2012
comment
Я обновил вопрос, чтобы подчеркнуть тот факт, что мне нужно изменить атрибуты поля формы на основе значений предыдущего шага.   -  person mbaechtold    schedule 30.05.2012


Ответы (2)


Я решил это, переопределив get_form_kwargs для WizardView. Обычно он просто возвращает пустой словарь, который заполняет 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 перед вызовом super:

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

и используйте это значение для выполнения любой логики, которая вам нужна в форме.

person Nick Gottlieb    schedule 26.10.2012

https://docs.djangoproject.com/en/1.4/ref/contrib/formtools/form-wizard/#django.contrib.formtools.wizard.views.WizardView.get_form

person VoSi    schedule 30.05.2012
comment
Я уже пробовал это (и соответственно обновил свой вопрос). - person mbaechtold; 30.05.2012