Получение идентификатора экземпляра в форме и сохранение в ней

#python #django #django-models #django-views #django-queryset

Вопрос:

Я создаю приложение для блога и работаю над функцией, в которой A user can report comment я создал другую модель для хранения reports , поэтому я сохраняю, о каком комментарии сообщается, Но я разместил форму отчета в подробном представлении, поэтому форма отчета будет ниже комментария на странице сведений о публикации, на которой я не получаю comment id при составлении отчета.

models.py

 class Blog(models.Model):  user = models.ForeignKey(User, on_delete=models.CASCADE)  title = models.CharField(max_length=1000)  class Comment(models.Model):  commented_by = models.ForeignKey(User, on_delete=models.CASCADE)  body = models.CharField(max_length=1000)  class ReportComment(models.Model):  reported_by = models.ForeignKey(User, on_delete=models.CASCADE)  reported_comment = models.ForeignKey(Comment, on_delete=models.CASCADE)  text = models.CharField(max_length=1000)  

views.py

 def blog_detail_page(request, blog_id):  post = get_object_or_404(Blog, pk=blog_id)   if request.method == 'POST':  reportform = CommentReportForm(data=request.POST)  if FlagCommentForm.is_valid():  form = reportform.save(commit=False)  # Saving in this line  flagForm.reported_comment = reportform.id  form.reported_by = request.user  form.save()  return redirect('home')   else:  reportform = CommentReportForm()      context = {'reportform':reportform, 'post':post}  return render(request, 'blog_detail_page.html', context)  

blog_detail_page.html

  {{post.title}}   {% for comment in post.comment_set.all %}  {{comment.body}}   lt;div class="container"gt;  lt;form method="post" enctype="multipart/form-data"gt;  {% csrf_token %}  lt;tablegt;  {{ reportform }}  lt;/tablegt;  lt;button type="submit"gt;Savelt;/buttongt;  lt;/formgt; lt;/divgt;  {% endfor %}   

What have I tried :-

  • I have also tried by using loop like :-
 comments = post.comment_set.all()   for com in comments:  if request.method == 'POST':  ......  if reportform.is_valid():  ....  ......  ......  form.reported_by = com  

Но он всегда сохранял идентификатор первого комментария.

  • Затем я попробовал request.POST методом, Как :-
 comment_ID = request.POST['comment_id']  

Но показана MultiValueDictKeyError ошибка.

Я пробовал много раз, но идентификатор комментария не сохраняется в экземпляре отчета.

Ответ №1:

Вам нужно будет добавить первичный ключ комментария в форму или в URL-адрес, по которому вы отправляете форму. Например, как элемент скрытой формы:

 lt;form method="post" enctype="multipart/form-data"gt;  {% csrf_token %}  lt;input type="hidden" name="comment_id" value="{{ comment.pk }}"gt;  lt;tablegt;  {{ reportform }}  lt;/tablegt;  lt;button type="submit"gt;Savelt;/buttongt; lt;/formgt; 

Альтернативой является создание URL-адреса, по которому вы сообщаете о комментарии с:

 urlpatterns = [  path('comment/lt;int:comment_idgt;/report', some_view, name='report-comment') ] 

затем вы можете отправить форму в это представление с помощью:

 lt;form method="post" action="{% url 'report-comment' comment_id=comment.pk %}" enctype="multipart/form-data"gt;  {% csrf_token %}  lt;tablegt;  {{ reportform }}  lt;/tablegt;  lt;button type="submit"gt;Savelt;/buttongt; lt;/formgt;