Передайте один и тот же случайно сгенерированный список как для ПУБЛИКАЦИИ, так и для ПОЛУЧЕНИЯ просмотров в python/django

#python #django

Вопрос:

Я разрабатываю приложение для викторины, которое извлекает случайное подмножество из 3 вопросов по набору вопросов. Я могу сгенерировать случайное подмножество без проблем и отобразить 3 вопроса с множественным выбором. Но когда пользователь делает выбор и отправляет, представление пустяков генерирует новое случайное подмножество. Таким образом, ответы пользователей затем сравниваются с правильными ответами нового случайного подмножества, а не с исходным подмножеством, которое просматривал пользователь. Как я могу создать это случайное подмножество и использовать его как в методах GET, так и в методах POST моего представления? То есть я хочу, чтобы набор запросов «мелочи» был одинаковым как в методах GET, так и в методах POST. Идеи?

мелочи защиты(запрос):

 trivia_id_list = Trivia.objects.values_list('id', flat=True)
random_trivia_id_list = random.sample(list(trivia_id_list), min(len(trivia_id_list),3))
trivia = Trivia.objects.filter(id__in=random_trivia_id_list)

if request.method == 'POST':
    correct = 0
    incorrect = 0
    total = 0

    for t in trivia:
        print(request.POST.get(t.question))
        print(t.answer)
        print()
        if t.answer == request.POST.get(t.question):
            correct = correct   1
        else:
            incorrect = incorrect   1
        total = total   1
    result = correct/total
    return render(request, 'ColdBlooded/result.html', {
        "Incorrect": incorrect,
        "Correct": correct,
        "Total": total,
        "Trivia": trivia,
        "Result": result,
    })
else:
    return render(request, "ColdBlooded/trivia.html", {
        "Trivia": trivia
    })
 

Ответ №1:

Проблема в первых трех строках

 trivia_id_list = Trivia.objects.values_list('id', flat=True)
random_trivia_id_list = random.sample(list(trivia_id_list), min(len(trivia_id_list),3))
trivia = Trivia.objects.filter(id__in=random_trivia_id_list)
 

Каждый раз, когда вы посещаете страницу, выполняется приведенный выше блок кода. Например, если пользователь посетит запрос страницы(GET), приведенный выше блок кода вернет три случайных вопроса. Если пользователь попытался ответить на запрос вопросов(POST), приведенный выше блок кода будет вызван снова и сгенерирует другой вопрос, отличный от вопроса в запросе GET.

Простое решение: поместите первые три строки в функцию и вызовите их только в запросе GET(условие else), а в случае публикации сравните результаты с результатами в публикации. Убедитесь, что вы определили список, содержащий вопросы, которые вызываются в GET, и очищайте его при каждом вызове POST.

Примечание:

Определите список, содержащий три вопроса, как глобальную переменную, чтобы он не инициализировался каждый раз.