【问题标题】:How to get the pk of a post in which a comment is contained?如何获取包含评论的帖子的pk?
【发布时间】:2020-02-03 02:11:55
【问题描述】:

在我的代码中,我的帖子上有一个“添加评论”选项,但由于我不断收到 NoReverseMatch 错误,我正在努力为创建评论表单创建一个取消按钮。我试图让取消按钮成为返回帖子的链接,而不是任何太花哨的东西,但它似乎无法识别我给它的 URL。它应该是我帖子的链接,同时调用包含评论的帖子的 pk。

我一直在尝试一些变通方法,包括指定的取消功能,尝试从 URL 中提取信息等,但就是看不到我做错了什么。更令人费解的是,与 CommentCreateView 相关的模板不起作用,但与 CommentUpdateView 相关的模板却可以,即使它们完全相同。我在下面包含了相关代码,而且我是 django 的新手,所以请让我知道是否还有其他有助于包含的内容。谢谢!

错误信息:

NoReverseMatch at /post/29/comment/

Reverse for 'post-detail' with arguments '('',)' not found. 1 pattern(s) tried: ['post/(?P<pk>[0-9]+)/$']

views.py:

class CommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    fields = ['text']

    def form_valid(self, form):
        form.instance.author = self.request.user
        form.instance.post_id = self.kwargs['pk']
        return super().form_valid(form)

    def get_success_url(self):
        post_number = Post.objects.get(pk=self.kwargs.get('pk'))
        return post_number.get_absolute_url()

class CommentUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Comment
    fields = ['text']

    def form_valid(self, form):
        form.instance.author = self.request.user.username
        return super().form_valid(form)

    def test_func(self):
        return self.request.user.username == self.get_object().author

    def get_success_url(self):
        return reverse('post-detail', kwargs={'pk': self.get_object().post.pk})

models.py:

class Comment(models.Model):
    post = models.ForeignKey('blog.Post', on_delete=models.CASCADE, related_name='comments')
    author = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    approved_comment = models.BooleanField(default=False)

    def approve(self):
        self.approved_comment = True
        self.save()

    def __str__(self):
        return self.text

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

urls.py

path('post/<int:pk>/comment/', CommentCreateView.as_view(template_name="blog/comments/comment_form.html"), name='add-comment-to-post'),
path('comment/<int:pk>/update/', CommentUpdateView.as_view(template_name="blog/comments/comment_update_form.html"), name='comment-update'),  # Update comment

comment_form.html(这似乎是由“post-detail”引起的问题。当我取出 object.post.id 并在“29”中进行硬编码时,这是我一直在测试的帖子的 pk ,它工作正常。显然这不是一个解决方案。):

<button class="btn btn-outline-info" type="submit">Post</button>
<a class="btn btn-outline-secondary" href="{% url 'post-detail' object.post.id %}">Cancel</a>

comment_update_form.html(有效的模板):

<button class="btn btn-outline-info" type="submit">Post</button>
<a class="btn btn-outline-secondary" href="{% url 'post-detail' object.post.id %}">Cancel</a>

再次感谢任何帮助!

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    comment_update_form.html 有效,因为该渲染模板中的对象已经保存并包含post 外键,因此object.post.id 解析为某些内容。 comment_form.html 不是这种情况。该模板中的“对象”尚不存在,因此不能具有post 属性。

    您需要找到另一种方法来解析模板中的 url - 如果您没有以任何其他方式将帖子 pk 插入模板中,也许您可​​以使用 view.kwargs.pk

    【讨论】:

    • 非常感谢,我刚刚接受了你的回答!我将 object.post.id 更改为 view.kwargs.pk 并且效果很好。不过,为了进一步理解,您能否解释一下 view.kwargs.pk 具体引用的是什么?并且是否可以询问是否有某种方法可以将对象保存在comment_form.html 的呈现模板中?如,更新类在哪里保存对象,但评论视图没有?
    • 模板中的view指的是视图实例(在本例中为CommentCreateView,它有一个名为kwargs的属性,它是一个url参数的字典。你的url有一个参数pk是帖子的id,不能把对象保存在模板里,把对象保存在视图里,这就是CreateView的目的。模板只是简单的输入数据,这样对象就可以保存在视图中。更新和创建视图都保存对象;但在更新视图的情况下,对象已保存,因此您正在使用现有实例。跨度>
    • 哦,我明白了。我尝试的其中一件事是在我的模板中引用CommentCreateView,但我没有意识到我只需要使用views。我什至没有想到该对象已经保存在更新视图中,因为评论已经提交。再次感谢您,这真的为我澄清了很多事情!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多