FormWizard или онлайн-тестирование за 15 минут
В очередной раз заглянув на страницу документации по Django я увидел, что в Django добавился класс FormWizard, предназначенный для обработки многостраничных форм. За небольшое время с помощью этого класса можно написать систему для проведения онлайн-тестирования со скромными начальными возможностями (возможен только один правильный вариант ответа на каждый вопрос, нет сохранения результатов в базе данных).
from django.db import models
class Question(models.Model):
text=models.CharField(max_length=40)
class Admin:
pass
class Meta:
pass
def __unicode__(self):
return self.text
class Answer(models.Model):
answer=models.CharField(max_length=120)
question=models.ForeignKey(Question)
correct=models.BooleanField()
class Admin:
pass
class Meta:
pass
def __unicode__(self):
return '%s:%s'%(self.question.text, self.answer)
views.py
from django.newforms import ModelForm
import django.newforms as forms
from django.utils.datastructures import SortedDict
from models import Answer, Question
def create_form(quest):
field_list = []
answers=Answer.objects.filter(question=quest)
lst=[]
for a in answers:
lst.append(tuple([str(a.id), a.answer]))
field_list.append(("question_%d" % (quest.id), forms.ChoiceField(label=('%s')%(quest.text), choices=tuple(lst), widget=forms.RadioSelect)))
return type(
'TestingForm',
(forms.BaseForm,),
{'base_fields': SortedDict(field_list)})
def BuildForms():
testing_forms=[]
questions = Question.objects.all().order_by('?')[:10]
for quest in questions:
testing_forms.append(create_form(quest))
return testing_forms
urls.py
from django.conf.urls.defaults import *
from main.views import *
from main.models import Answer
from django.shortcuts import render_to_response
from django.contrib.formtools.wizard import FormWizard
class TestingWizard(FormWizard):
def done(self, request, form_list):
answers=[int(val) for form in form_list for key, val in form.cleaned_data.items() ]
count_correct = Answer.objects.filter(id__in=answers).filter(correct=1).count()
return render_to_response('done.html', {
'form_data': [form.cleaned_data for form in form_list],
'count_correct': count_correct,
})
urlpatterns = patterns('',
(r'^test/$', TestingWizard(BuildForms())),
(r'^admin/', include('django.contrib.admin.urls')),
)
base.html
Online test {% block content %} {% endblock %}
done.html
{% extends "base.html" %}
{% block content %}
<br>Thank you for test<br>
Correct: {{ count_correct }}
{% endblock %}
forms/wizard.html
{% extends "base.html" %}
{% block content %}
<p>Step {{ step }} of {{ step_count }}</p>
<form action="." method="post">
<table>
{{ form.as_p }}
</table>
<input type="hidden" name="{{ step_field }}" value="{{ step0 }}" />
{{ previous_fields|safe }}
<input type="submit" value="go">
</form>
{% endblock %}
Comments
Comment form for «FormWizard или онлайн-тестирование за 15 минут»