Приложение 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)

Как мне поступить. Какие функции нужно изменить? Пожалуйста помоги.

0 ответов

Другие вопросы по тегам