jjlights
jjlights

Reputation: 11

django: request.POST key is empty if the choicefield value is not set

I am currently beginning web development using django. In my application, I want a form with a varied number of questions and their choices to be presented.

In models.py, a table is create to store the questions

class QuizItems(models.Model):
    question = models.CharField(max_length=255)
    choices = SeparatedValuesField(token="$")
    answer = models.IntegerField()

In form.py, I overload the __init__ method in Form class so as to pass qchoose, a list of QuizItems instances to create the form fields.

def choiceItem(question):
    return [(unicode(idx), q) for idx, q in enumerate(question.choices)] 

class QuizForm(forms.Form):
    def __init__(self, qchoose, *args, **kwargs):
        super(QuizForm, self).__init__(*args, **kwargs)
        for q in qchoose:
            self.fields[str(q.id)] = forms.ChoiceField(required=True,
              label=q.question, widget=forms.RadioSelect(),choices=choiceItem(q))

Then in view.py

if request.method == 'POST':
    idlst = request.POST.keys()
else:
    # qchoose is a list of quizitems
    form = QuizForm(qchoose)

In quiz.html

{% for field in form %}
<li><b> {{ field.label }} </b></li>                                                                                                                      
<ul> {{ field }} </ul>
{% endfor %}

I want to get idlst, the list of question id, that I can get the correct answers from. It works fine when all the choicefields are filled. The problem is if there is any choicefield value is empty, I won't get its key. I think since the request.POST is a dictionary, it is supposed to return all the keys even if its value is empty.

Could anyone help me what is wrong with my code or anything missing? Thank you!

Upvotes: 0

Views: 1657

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 600059

You're supposed to use the form on POST as well, then call is_valid() and access the form's cleaned_data dict.

Upvotes: 1

Related Questions