On Thu, 2008-01-03 at 09:51 -0800, Wes Winham wrote:
> Hello,
>
> I've got a bit of a design issue I'm trying to wrap my head around in
> order to do things the Django Way.
>
> I'm attempting to creating a simple form that allows a user to take a
> multiple choice "quiz." Quiz is a model and it has a many to many with
> Questions which has a m2m with AnswerOptions.
>
> I'm also not sure on which is the best way to get the questions and
> answers to the form and I'm not sure if I should be using one form, or
> a collection of forms.
Hmm .... deja vu. I've been working on an almost analogous problem this
morning. I haven't coded it all up yet, but here's my current design
thinking...
Each question is a form class. You can use the same form class each time
and part of its __init__ method will be to store the "question" string
(say in self.question). I will display 'N' of these on the page using
the "prefix" attribute to the form's __init__ method. So it will look
something like this:
class QuestionForm(forms.Form):
answers = forms.ChoiceField(widget=forms.RadioSelect)
def __init__(self, question, *args, **kwargs):
super(Question, self).__init__(*args, **kwargs)
self.question = question
self.fields['answers'].choices = ...
I also have some meta-information in the form, such as a security hash
to make sure the form isn't modified, so that uses another form class
(which currently just contains the security hash, but I might need other
stuff when I flesh things out).
Then my view will look like this:
def quiz_view(request, quiz_id):
quiz = Quiz.objects.get(pk=quiz_id)
if request.method == 'POST':
# TODO ...
else:
meta = MetaForm(quiz)
q_forms = []
for num, question in enumerate(quiz.questions.all()):
q_forms.append(QuestionForm(question, prefix=str(num)))
return render_to_response('quiz.html', {'meta': meta_form,
'question_forms': q_forms})
and then, in the template:
<form ....>
{{ meta }}
{% for form in question_forms %}
<p>{{ form.question }}</p>
{{ form.as_p }}
{% endfor %}
<input type="submit" ...>
</form>
Obviously, a lot has been glossed over here (and there are no doubt some
bugs, as I haven't finalised the code in my case yet and I'm simplifying
a bunch of stuff). The point I want to make, though, is that I'm using
multiple form classes to render a *single* HTML form. I'm also shoving
things like the question text into the appropriate form so that I can
use that normally in the template (it's not a form field, so it wouldn't
normally be displayed).
In the final analysis, I'll end up pulling out the form creation stuff
into a separate function, since I need to do it in multiple places (at
least, in both the POST and GET paths), but that's just normal stuff.
Hopefully this gives you another idea to play with. I don't think any of
your options allowed for the possibility of multiple form classes, but
sometimes that can make things a lot easier.
Regards,
Malcolm
--
Save the whales. Collect the whole set.
http://www.pointy-stick.com/blog/
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---