From: Tom Walker Date: Tue, 15 Jul 2014 21:05:11 +0000 (+0100) Subject: finally getting round to properly implementing forms with CBVs for the main portion... X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=8cae35634b7954083ccae3cff86a34767b8794f1;p=django_quiz.git finally getting round to properly implementing forms with CBVs for the main portion of the quiz rather than hacking request objects :S --- diff --git a/quiz/forms.py b/quiz/forms.py index 9afb3cf..18fd282 100644 --- a/quiz/forms.py +++ b/quiz/forms.py @@ -1,2 +1,11 @@ from django import forms -from django.forms.models import inlineformset_factory +from django.forms.widgets import RadioSelect + + +class QuestionForm(forms.Form): + def __init__(self, question, *args, **kwargs): + super(QuestionForm, self).__init__(*args, **kwargs) + self.fields["answers"] = forms.ModelChoiceField( + queryset=question.get_answers(), + empty_label=None, + widget=RadioSelect) diff --git a/quiz/templates/question.html b/quiz/templates/question.html index 68b7ac9..eac58db 100644 --- a/quiz/templates/question.html +++ b/quiz/templates/question.html @@ -51,7 +51,7 @@

{{ question.content }}

-
+{% csrf_token %} diff --git a/quiz/tests.py b/quiz/tests.py index 4e8706e..eb7963e 100644 --- a/quiz/tests.py +++ b/quiz/tests.py @@ -315,7 +315,7 @@ class TestNonQuestionViews(TestCase): self.assertEqual((score, possible), (0.5, 2)) score, possible = anon_session_score(request) - self.assertEqual((score, possible), (0, 0)) + self.assertEqual((score, possible), (0.5, 2)) class TestQuestionViewsAnon(TestCase): diff --git a/quiz/urls.py b/quiz/urls.py index f56fb50..de6e231 100644 --- a/quiz/urls.py +++ b/quiz/urls.py @@ -1,7 +1,7 @@ from django.conf.urls import patterns, url from .views import QuizListView, CategoriesListView,\ - ViewQuizListByCategory, QuizUserProgressView, QuizDetailView + ViewQuizListByCategory, QuizUserProgressView, QuizDetailView, QuizTake urlpatterns = patterns('quiz.views', @@ -30,4 +30,8 @@ urlpatterns = patterns('quiz.views', url(regex=r'^(?P[\w-]+)/take/$', view='quiz_take', name='quiz_question'), + + url(regex=r'^x/(?P[\w-]+)/take/$', + view=QuizTake.as_view(), + name='quiz_question'), ) diff --git a/quiz/views.py b/quiz/views.py index 9975156..0a92b35 100644 --- a/quiz/views.py +++ b/quiz/views.py @@ -4,8 +4,9 @@ from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, render, render_to_response from django.template import RequestContext from django.utils.decorators import method_decorator -from django.views.generic import DetailView, ListView, TemplateView +from django.views.generic import DetailView, ListView, TemplateView, FormView +from .forms import QuestionForm from .models import Quiz, Category, Progress, Sitting, Question @@ -292,3 +293,54 @@ def final_result_anon(request, quiz, previous): 'session': session_score, 'possible': session_possible}, context_instance=RequestContext(request)) + + +def form_test(request, quiz_name): + quiz = Quiz.objects.get(url=quiz_name.lower()) + try: + sitting = Sitting.objects.get(user=request.user, + quiz=quiz, + complete=False) + + except Sitting.DoesNotExist: + sitting = Sitting.objects.new_sitting(request.user, quiz) + + except Sitting.MultipleObjectsReturned: + sitting = Sitting.objects.filter(user=request.user, + quiz=quiz, + complete=False)[0] + + question = sitting.get_first_question() + form = QuestionForm(question=question) + return render_to_response('q_test.html', {'form': form, + 'question': question}) + + +class QuizTake(FormView): + form_class = QuestionForm + template_name = 'q_test.html' + + def get_context_data(self, **kwargs): + context = super(QuizTake, self).get_context_data(**kwargs) + context['question'] = self.question + return context + + def get_form_kwargs(self): + kwargs = super(QuizTake, self).get_form_kwargs() + quiz = get_object_or_404(Quiz, url=self.kwargs['quiz_name']) + + try: + sitting = Sitting.objects.get(user=self.request.user, + quiz=quiz, + complete=False) + + except Sitting.DoesNotExist: + sitting = Sitting.objects.new_sitting(self.request.user, quiz) + + except Sitting.MultipleObjectsReturned: + sitting = Sitting.objects.filter(user=self.request.user, + quiz=quiz, + complete=False)[0] + + self.question = sitting.get_first_question() + return dict(kwargs, question=self.question)