#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;