Сложность присвоения поля значения 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, или добавить дополнительные условия, чтобы убедиться, что вы можете различать запросы