如何在帖子详细信息页面Django上显示我的评论表单

时间:2019-09-25 15:31:53

标签: python django django-models django-forms django-views

因此,目前基本上,如果用户要在我的网站上的帖子中添加评论,它将带他们进入带有表单的另一页。但是,我希望评论表单位于实际的“帖子详细信息”页面上,因此用户不必转到另一个页面即可发表评论。

到目前为止,我已经尝试添加一些上下文内容,并将注释表单位置的url更改为post_detail.html,并将comment_form.html的代码放在此处,但这没用。

以下是相关的views.py add_comment_to_post视图

@login_required(login_url='/mainapp/user_login/')
def add_comment_to_post(request,pk):
    post = get_object_or_404(Post,pk=pk)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.post = post
            comment.author = request.user # add this line
            comment.save()
            return redirect('mainapp:post_detail',pk=post.pk)
            # remove `def form_valid`
    else:
        form = CommentForm()
    return render(request,'mainapp/comment_form.html',{'form':form})

这是PostDetailView视图。

class PostDetailView(DetailView):
    model = Post

这是comment_form.html代码

<form class="post-form" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="submitbtn">Comment</button>
</form>

这是相关的urls.py文件

path('post/<int:pk>/comment/', views.add_comment_to_post, name='add_comment_to_post'),

path('post/<int:pk>', views.PostDetailView.as_view(), name='post_detail'),

因此,目前,当我认为自己的解决方案可行时,我将comment_form.html的代码添加到了post_detail.html文档中,但是只显示了Comment html按钮。如何将CommentForm与帖子详细信息页面放在同一页面上?

感谢您的帮助:)

2 个答案:

答案 0 :(得分:1)

问题是,当Django渲染PostDetailView时,context字典没有form项(form项仅在您的{ {1}}视图,因为Django模板引擎无法从add_comment_to_post字典中找到form项,所以它没有呈现任何内容。

您需要做的是更改context并将PostDetailView注入CommentForm的上下文中。这是一种实现方法:

PostDetailView

您要做的基本上是覆盖默认的class PostDetailView(DetailView): model = Post def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['form'] = CommentForm() # Inject CommentForm return context ,并将您的get_context_data作为CommentForm()的一部分注入,然后进行渲染

答案 1 :(得分:0)

您可以尝试这样:

class PostDetailView(DetailView):
        model = Post

        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['comment_form'] = YourModelFormForComment()  # Your comment form
            return context

在模板中

{{comment_form.as_p}}