Как перемешать порядок элементов объекта Django на странице?

Я пытаюсь создать игру, которая позволяет пользователям играть в викторину, которая хранится как объект Django, но я хочу, чтобы порядок вопросов был разным (как бы случайным) каждый раз. Есть ли способ добиться этого?

models.py

class Quiz(models.Model):
    user = models.ForeignKey(Profile, on_delete=models.CASCADE, default="")
    title = models.TextField(default="")
    question1 = models.TextField()
    answer1 = models.TextField()
    question2 = models.TextField()
    answer2 = models.TextField(default="")
    question3 = models.TextField()
    answer3 = models.TextField()
    ...

(Вопросы и ответы идут до 10.)

views.py

def quiz(request, quiz_id):
    quiz = get_object_or_404(Quiz.objects, pk=quiz_id)
    return render(request, "capstone/quiz.html", {
        "quiz": quiz
        })

Я думал о генерации случайного числа, но думаю, что это будет слишком сложно при таком количестве вопросов. Есть ли более простой способ случайного отображения вопросов пользователю?

Попробуйте использовать встроенную функцию ORM.

Quiz.objects.order_by('?')

Ниже приведено извлечение вопросов из вашего набора queryset в кортеж, содержащий вопрос и номер вопроса, а затем перемешивание кортежей, помещая их в собственное контекстное значение

import random

def quiz(request, quiz_id):
    quiz = get_object_or_404(Quiz.objects, pk=quiz_id)
    #convert the queryset into a dict so we can get the questions
    quiz_values = quiz.values()
    quiz_questions = []
    for i in range(1,11):
        quiz_questions.append((i, quiz_values['question' + str(i)]))
    random.shuffle(quiz_questions)
    return render(request, "capstone/quiz.html", {
        "quiz": quiz, "quiz_questions": quiz_questions
        })

Затем в своем шаблоне вы можете сослаться на что-то вроде

{% for q in quiz_questions %}
   {{q.1}} <!-- question text  -->
   <input type="text" name="id_question{{q.0}}">  <!-- question number -->
{% endfor %}

... чтобы ваша форма не потеряла информацию о том, на какой вопрос дается ответ.

Вернуться на верх