Сложность присвоения поля значения ForeignKey форме в цикле

Я столкнулся с проблемой присвоения значения ForeignKey полю формы в цикле.

У меня есть Django-приложение, в котором пользователи могут отправлять ответы на вопросы, и каждый ответ может иметь несколько комментариев, связанных с ним. Чтобы пользователи могли добавлять комментарии к каждому ответу, я реализовал форму в цикле. Однако, когда пользователи отправляют комментарий с помощью формы, вместо того, чтобы создать объект CommentAForm, создается объект CommentQForm. Несмотря на попытку передать идентификатор ответа в качестве скрытого поля в CommentAForm, значение, похоже, не присваивается правильно объекту CommentAForm. В результате комментарии не ассоциируются с правильной формой или объектом модели, я не знаю, что происходит, как я могу это исправить

Просмотров:

def view_question(request, slug):
    question = get_object_or_404(Question, slug=slug)
    answers = Answer.objects.filter(post=question)
    answers_comment = CommentA.objects.filter(post__id__in=answers)

     # this is the comment form for each question
    if request.method == 'POST':
        comment_form = CommentQForm(request.POST)
        if comment_form.is_valid():
            my_comment_form = comment_form.save(commit=False)
            my_comment_form.user = request.user
            my_comment_form.post = question
            my_comment_form.save()
            return redirect('View_Question', slug=slug)
    else:
        comment_form = CommentQForm()

    # This is the comment form each answer
    if request.method == 'POST':
        answer_comment_form = CommentAForm()
        if answer_comment_form.is_valid():
            my_answer_comment_form = answer_comment_form.save(commit=False)
            my_answer_comment_form.user = request.user
            my_answer_comment.post = Answer.objects.get(id=request.POST.get('answer'))
            my_answer_comment.save()
            return redirect('View_Question', slug=slug)
    else:
        answer_comment_form = CommentAForm()

    context = {"question":question, "answers":answers, "answer_form":answer_form,
    "comment_form":comment_form, "comments":comments, "answers_comment":answers_comment,
    "answer_comment_form":answer_comment_form}
    return render(request, 'view_question.html', context)

Шаблон:

{% for answer in answers %}
    <div class="row my-3 border-top pb-2 mb-2 p-2">
        <div class="answer-icons">
            <span><i class="fas fa-arrow-up"></i>
                {{ answer.up_vote }}
            </span>
            <span><i class="fas fa-arrow-down"></i>
                {{ answer.down_vote }}
            </span>
        </div>
        <div class="answer-text card-content">
            <p>{{ answer.your_answer|convert_markdown|safe }}</p>
        </div>
    </div>

    <div class="comment-container m-3">
        {% for comment in answer.comments.all %}
            <div class="row border-bottom pb-2 mb-2">
                {{ comment.comment|convert_markdown|safe }}                
                <div class="comment-avatar">
                {% with comment.user.account as account %}
                    <a style="text-decoration: none;" class="user-avatar" href="{% url 'Public-Profile' slug=account.slug %}">
                        <span style="background-color: #888888; color: white;
                        border-radius: 5px; margin-right: 5px;">
                            -{{ comment.user.username }}
                        </span>
                    </a>
                    {{ comment.created_at|naturaltime }}
                {% endwith %}
                </div>
            </div>
        {% endfor %}
    </div>
    <div class="add-comment">
        <a href="" data-bs-toggle="collapse" data-bs-target="#collapseExample" aria-expanded="false" aria-controls="collapseExample">
            <small>Add Comment</small>
        </a>
        <div class="collapse" id="collapseExample">
            <div class="row">
                <div class="col">
                    {% load crispy_forms_tags %}
                    <form action="" method="post">
                        {% csrf_token %}
                        {{ answer_comment_form|crispy }}
                        <input type="hidden" name="answer" value="{{ answer.id }}">
                        <button type="submit" class="btn btn-primary">submit</button>
                    </form>
                </div>
            </div>
          </div>
         </div>
{% endfor %}

мои модели:

class CommentA(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    comment = models.TextField()
    post = models.ForeignKey(Answer, on_delete=models.CASCADE, related_name='comments')
    created_at = models.DateTimeField(auto_now_add=True)

class CommentQ(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    comment = models.TextField()
    post = models.ForeignKey(Question, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

Формы:

class CommentAForm(forms.ModelForm):
    class Meta:
        model = CommentA
        fields = ['comment']
        widgets = {
            'comment': forms.Textarea(attrs={'rows':3, 'cols':15})
        }

class CommentQForm(forms.ModelForm):
    class Meta:
        model = CommentQ
        fields = ['comment']
        widgets = {
            'comment': forms.Textarea(attrs={'rows':3, 'cols':15})
        }

В представлении есть 2 оператора if, оба if request.method == 'POST':, поэтому каждый раз, когда вы пытаетесь отправить сообщение, он просто нажимает на первый, создает объект CommentQObject и возвращается.

Вам нужно будет создать вторую конечную точку/маршрут для другого POST, или добавить дополнительные условия, чтобы убедиться, что вы можете различать запросы

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