Atma
Atma

Reputation: 29775

not getting past form.is_valid to process form in django view

I have the following form i populate based on a question id:

class QuestionForm(forms.Form):
    options = forms.ModelMultipleChoiceField(queryset=Option.objects.none(), 
                                    widget=forms.RadioSelect)

    def __init__(self, *args, **kwargs):
        question_id = kwargs.pop('question_id', None)
        if question_id:
            print question_id
            super(QuestionForm, self).__init__()
            question = Question.objects.get(pk=question_id)
            ts = Option.objects.filter(question = question)
            for t in ts:
                print t.name
            self.fields['options'].queryset = Option.objects.filter(question = question)

    def clean(self):
        print 'in clean'
        cleaned_options = self.cleaned_data['options']
        try:
            print cleaned_options
            raise forms.ValidationError('That is not the right answer.  Try again.')
        except:
            return cleaned_options 

I call it from my view like this:

if request.method == "POST":
        print 'in post'
        form = QuestionForm(request.POST, question_id=question.id)
        print '---'
        options = request.POST.getlist('options')
        option = options[0]
        print option
        if form.is_valid():
            print '******'

My template looks simply like this:

<form action="" method="post">
    {% csrf_token %}
    {{ form }}
    {{ form.errors }}
    <br />
    <button type="submit">Save</button>
</form>

I get the option I selected, but I am unable to trigger the clean method to alert the user whether the correct answer is selected or not.

What am I doing wrong?

Upvotes: 0

Views: 56

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599778

You have a number of issues in your __init__ method.

The one that's causing your actual problem is that you are not passing args and kwargs on to the superclass method. So the form data is never actually assigned, so is_valid can never be true. You should be doing this:

super(QuestionForm, self).__init__(*args, **kwargs)

Just as important, though, that super call should not be indented inside the if statement. You need to make that call whatever happens. The easiest fix here would be to move it to before the if.

Upvotes: 2

Related Questions