tags:

views:

24

answers:

2

I've got two forms on one page. If a user selects a certain option on one form, I want to make an option on the other form no longer required. How can I do that? I don't think I can put the logic in the clean method because they're separate forms.

A: 

I would disable the fields using javascript. I would recommend looking up JQuery.

Caimen
I'm well aware of jQuery ty, and I'm using it extensively, but this doesn't help me with a server-side solution. JS is bypassable.
Mark
+1  A: 

You can do this in the view, as long as you set the required flag to False before you call is_valid on your second form.

class MyForm1(forms.Form):
    other_field_required = forms.BooleanField(required=False)

class MyForm2(forms.Form):
    sometimes_required = forms.CharField(required=True)

def myview(request):
    form1 = MyForm1(request.POST)
    form2 = MyForm2(request.POST)

    if form1.is_valid():
        if not form1.cleaned_data['other_field_required']:
            form2.fields['sometimes_required'].required = False

    ...
        if form2.is_valid(): # form2 will be valid if other_field_required was False

Or, you could add myform2 as an argument to your first form's __init__ method, then you can put the logic in the clean method.

class MyForm1(forms.Form):
    other_field_required = forms.BooleanField(required=False)

    def __init__(myform2, *args, **kwargs):
        super(MyForm1, self).__init__(*args, **kwargs)
        self.form2 = form2

    def clean(self):
        if not self.cleaned_data['other_field_required']:
        self.form2.fields['other_field_required'].required = False
...

def myview(request):
    form2 = MyForm2(request.POST)
    form1 = MyForm1(form2, data=request.POST)
    ...
Alasdair
Sneaky! I like it! You should have seen the hack job I came up with... it's awful!
Mark