About Blog |

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 %}
Add post to: Delicious Reddit Slashdot Digg Technorati Google
Comment

Comments

No comments for this post

Comment form for «FormWizard или онлайн-тестирование за 15 минут»

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image