Django создает дополнительный объект при отправке - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь создать объект ответа после рендеринга страницы, когда пользователь предоставляет свой ввод, объект ответа должен быть обновлен с новым вводом и сохранен. Я могу сделать это, но по какой-то причине дополнительный объект создается, когда пользователь нажимает кнопку отправки, и этот объект всегда Нет. Я использую AJAX для отправки данных из шаблона.

views.py

def attention_view(request):
    participant = get_object_or_404(Participant, user=request.user)

    if request.method == 'POST':

        question_id = request.POST.get('assigned_question')
        question = get_object_or_404(Question, pk=question_id)
        answer = Answer.objects.get(participant=participant, question=question)

        if answer.answer is not None: 
            #preventing participants from changing their answer
            HttpResponse('')

        else:

            answer.answer = selected_choice
            answer.save()

    attention_question = Question.objects.get(id=13)
    answer = Answer.objects.create(participant=participant, question=attention_question)
    context = {'attention_question': attention_question, 'answer': answer}
    return render(request, 'study/AttentionCheck.html', context)

что может быть причиной создания дополнительного объекта?

1 Ответ

1 голос
/ 03 мая 2020

Ваш лог c (упрощенный):

    if request.method == 'POST':
        if answer.answer is not None: 
            # HttpResponse created and freed right away
            pass
        else:
            answer.answer = selected_choice
            answer.save()

    answer = Answer.objects.create(participant=participant,
      question=attention_question)

    return render(request, 'study/AttentionCheck.html', context)

Обратите внимание, что 1) вы всегда вызываете Answer.objects.create 2) всегда возвращаете обработанный AttentionCheck. html.

Я также заметил, что вы имеете здесь два разных вопроса: вопрос с id, заданным POST, и вопрос с id из 13.

В зависимости от ваших точных требований, я думаю, что это должно быть решением:

def attention_view(request):
    participant = get_object_or_404(Participant, user=request.user)

    question = FIXME_WHICH_QUESTION

    answer, created = Answer.objects.get_or_create(participant=participant,
        question=question)

    if request.method == 'POST' and answer.answer is None: 
        answer.answer = selected_choice
        answer.save()

    context = {'attention_question': question, 'answer': answer}
    return render(request, 'study/AttentionCheck.html', context)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...