Как перемешать порядок элементов объекта 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 %}
... чтобы ваша форма не потеряла информацию о том, на какой вопрос дается ответ.