Мой список внезапно становится пустым, и я не могу его восстановить

Я новичок в django и пытался создать сайт, на котором пользователь может пройти викторину. В более простой версии я хотел, чтобы вопросы отображались в случайном порядке, один за другим (когда пользователь нажимает на кнопку) и когда все вопросы были отображены, чтобы вернуться на главную страницу, где есть ссылка "пройти тест". Я знаю, что это, конечно, не самый эффективный способ, но я хочу знать, что не так с моим кодом.

urls.py:

path('start',views.startquiz,name='start'),
path('test/<int:pk>/<int:index>',views.TakeQuizView.as_view(),name='test'),

views.py:

def startquiz(request):
    questions=list(Question.objects.all())
    question=random.choice(questions)
    pk=question.id
    return redirect(reverse('quiz:test',args=(pk,1)))

class TakeQuizView(LoginRequiredMixin,View):
    questions=list(Question.objects.all())
    n=len(questions)

    def get(self,request,pk,index):
        question=Question.objects.get(id=pk)
        self.questions.remove(question)
        ctx={'question':question,'index':index,'n':self.n}
        return render(request,'quiz/test.html',ctx,)

    def post(self,request,pk,index):
        if index<self.n:
            question=random.choice(self.questions)
            pk=question.id
            return redirect(reverse('quiz:test',args=(pk,index+1)))
        else:
            self.questions=list(Question.objects.all())
            return redirect(reverse_lazy('quiz:main'))

` Когда я прохожу тест в первый раз, все работает нормально, и после отображения всех вопросов он возвращается на главную страницу. Однако, если я хочу пройти тест снова, список вопросов не заполняется, и я получаю ошибку: list.remove(x): x not in list from remove()

Я также попытался поместить в метод get следующий код: `

if index==1:
    self.questions=list(Question.objects.all())

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

Проблема с вашим подходом заключается в том, что HTTP не имеет статических данных. Каждый запрос должен содержать всю информацию, необходимую серверу для его обработки. Другими словами, сервер не должен хранить никаких данных. В вашем случае список questions представляет собой состояние.

Более подробно о HTTP и его безстатусности: Почему говорят, что "HTTP - это протокол без статичности"?

Вместо того чтобы хранить список вопросов на стороне сервера, вы должны случайным образом извлекать вопрос при каждом запросе от клиента. Как извлечь случайную запись, используя ORM Django?

Чтобы убедиться, что один и тот же вопрос не появляется дважды, существует несколько возможных решений:

  1. клиент должен посылать идентификаторы просмотренных вопросов (возможно, с помощью параметров get Query) при запросе нового вопроса.
  2. клиент хранит session_id и посылает его на сервер с каждым запросом. Сервер затем хранит в таблице соответствие между идентификатором сессии и вопросом, который был показан до сих пор.
  3. .
  4. cookies тоже может быть решением, но я бы сказал, что это самое сложное из трех
  5. .

Лично я бы выбрал первое решение.

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