【发布时间】: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>
再次感谢任何帮助!
【问题讨论】: