Приложение Django Quiz, получение предыдущего вопроса
Я пытаюсь создать портал викторин и учиться на ходу. Я использую https://github.com/tomwalker/django_quiz/ в качестве отправной точки и добавляю дополнительные функции.
Я хотел добавить функцию для получения предыдущих вопросов, поэтому я добавил кнопку
<form action="" method="POST" class="shadow p-4 mb-4 bg" id="question-form">
{% csrf_token %}
<input type="hidden" id="duration" value="{{quiz.durationtest}}">
<input type="hidden" id="quizid" value="{{quiz.id}}">
{% if progress %}
<input id="currnumb" type="hidden" value ="{{ progress.0|add:1 }}">
<input id="totalques" type="hidden" value ="{{ progress.1 }}">
<div class="countdown float-right" style="font-weight:900; font-size:16px;"></div>
<p class="lead">{% trans "Question" %} {{ progress.0|add:1 }} {% trans "of" %} {{ progress.1 }}</p>
{% if question.questionmarks %}
<p class="lead"><strong>Marks: {{question.questionmarks}}</strong></p>
{% endif %}
<div class="progress mb-5">
<div class="progress-bar" id ="progress-bar" role="progressbar" >
</div>
</div>
{% endif %}
{% if question.figure %}
<img src="{{ question.figure.url }}" alt="{{ question.content }}" />
{% endif %}
<input type=hidden name="question_id" value="{{ question.id }}" class="question_id">
<div class="row">
<div class="col-md-12 column " oncontextmenu="return false" onkeydown="if ((arguments[0] || window.event).ctrlKey) return false " ondragstart="return false" onselectstart="return false">
<div class="panel panel-primary">
<div class="panel-heading ">
<h3 class="panel-title mb-3" style="pointer-events: none;" >
{% autoescape off %}{{ question.content }}{% endautoescape %}
</h3>
</div>
<div class="panel-body ">
<ul class="list-group">
{% for answer in form.answers %}
<li class="list-group-item quiz-answers">
<span>{{ answer }} </span>
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
</div>
<div class="row mt-3">
{% if previous.previous_question%}
<div class="col-md-2 panel-footer">
<input type="button" value={% trans "Previous" %} class="btn btn-sm btn-block btn-success shadow-3" id="prevquestion" >
</div>
{% endif %}
<div class="col-md-2 offset-md-8 panel-footer">
<input type="submit" value={% trans "Next" %} class="btn btn-sm btn-block btn-danger shadow-3" id="nextquestion" >
</div>
</div>
</form>
Я хотел написать метод, когда я нажимаю «Предыдущий», чтобы вернуть предыдущий вопрос.
def dispatch(self, request, *args, **kwargs):
self.quiz = get_object_or_404(Quiz, url=self.kwargs['quiz_name'])
if self.quiz.draft and not request.user.has_perm('quiz.change_quiz'):
raise PermissionDenied
try:
self.logged_in_user = self.request.user.is_authenticated()
except TypeError:
self.logged_in_user = self.request.user.is_authenticated
if self.logged_in_user:
self.sitting = Sitting.objects.user_sitting(request.user,
self.quiz)
else:
self.sitting = self.anon_load_sitting()
if self.sitting is False:
#print("1")
return render(request, self.single_complete_template_name)
#print("2")
return super(QuizTake, self).dispatch(request, *args, **kwargs)
def get_form(self, *args, **kwargs):
if self.logged_in_user:
self.question = self.sitting.get_first_question()
self.progress = self.sitting.progress()
else:
self.question = self.anon_next_question()
self.progress = self.anon_sitting_progress()
if self.question.__class__ is Essay_Question:
form_class = EssayForm
else:
form_class = self.form_class
#print("3")
return form_class(**self.get_form_kwargs())
def get_form_kwargs(self):
kwargs = super(QuizTake, self).get_form_kwargs()
#print(kwargs)
return dict(kwargs, question=self.question)
def form_valid(self, form):
if self.logged_in_user:
self.form_valid_user(form)
if self.sitting.get_first_question() is False:
#print("5")
return self.final_result_user()
else:
self.form_valid_anon(form)
if not self.request.session[self.quiz.anon_q_list()]:
#print("6")
return self.final_result_anon()
self.request.POST = {}
#print(self.request.POST)
return super(QuizTake, self).get(self, self.request)
def get_context_data(self, **kwargs):
context = super(QuizTake, self).get_context_data(**kwargs)
context['question'] = self.question
context['quiz'] = self.quiz
if hasattr(self, 'previous'):
context['previous'] = self.previous
if hasattr(self, 'progress'):
context['progress'] = self.progress
#print(context)
return context
def form_valid_user(self, form):
progress, c = Progress.objects.get_or_create(user=self.request.user)
guess = form.cleaned_data['answers']
is_correct = self.question.check_if_correct(guess)
if is_correct is True:
#self.sitting.add_to_score(1)
self.sitting.add_to_score(self.question.questionmarks)
progress.update_score(self.question, 1, 1)
else:
self.sitting.add_incorrect_question(self.question)
progress.update_score(self.question, 0, 1)
print(self.quiz.answers_at_end)
if self.quiz.answers_at_end is not True:
self.previous = {'previous_answer': guess,
'previous_outcome': is_correct,
'previous_question': self.question,
'answers': self.question.get_answers(),
'question_type': {self.question
.__class__.__name__: True}}
print(self.previous)
else:
self.previous = {}
self.sitting.add_user_answer(self.question, guess)
self.sitting.remove_first_question()
При нажатии следующей кнопки форма отправляется и запускается get_first_question
def get_first_question(self):
"""
Returns the next question.
If no question is found, returns False
Does NOT remove the question from the front of the list.
"""
if not self.question_list:
return False
first, _ = self.question_list.split(',', 1)
question_id = int(first)
return Question.objects.get_subclass(id=question_id)
Как мне поступить. Какие функции нужно изменить? Пожалуйста помоги.