添加到 post 的评论:找不到页面 (404)
Adding to comments to post: Page not found (404)
嗨,Djangonauts 我是 Django 的新手,如果我的代码中有愚蠢的错误,请原谅我,我目前正在尝试向我的 post 模型添加评论
下面是我的models.py
class Post(models.Model):
user = models.ForeignKey(User, related_name='posts')
title = models.CharField(max_length=250, unique=True)
slug = models.SlugField(allow_unicode=True, unique=True)
message = models.TextField()
def get_absolute_url(self):
return reverse('posts:single', kwargs={'username': self.user.username, 'slug': self.slug})
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super().save(*args, **kwargs)
class Comment(models.Model):
post = models.ForeignKey(Post, related_name='comments')
author = models.ForeignKey(User, related_name='comments')
text = models.TextField()
def get_absolute_url(self):
return reverse('posts:single', kwargs={'username': self.post.user.username,
'slug': self.post.slug})
views.py 第一次尝试
@login_required
def add_comment_to_post(request, slug):
post = get_object_or_404(Post, slug=slug)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.author = request.user
comment.save()
return redirect('posts:single', username=comment.author.username, slug=post.slug)
else:
form = CommentForm()
return render(request, 'posts/comment_form.html', {'form': form})
@login_required
def remove_comment(request, pk):
comment = get_object_or_404(Comment, pk=pk)
comment.author = request.user
post_slug = comment.post.slug
comment.delete()
return redirect('posts:single', username=request.user.username, slug=post_slug)
urls.py
url(r'^(?P<slug>[-\w]+)/add_comment/$', views.CommentCreate.as_view(), name='add_comment'),
我还有下面的 FBV urls 它们都给我同样的错误
url(r'^(?P<slug>[-\w]+)/add_comment/$', views.add_comment_to_post, name='add_comment'),
url(r'^(?P<pk>\d+)/remove_comment/$', views.remove_comment, name='remove_comment'),
Views.py 第二次尝试
class CommentCreate(LoginRequiredMixin, CreateView):
model = Comment
fields = ('text',)
form_class = 'posts/comment_form.html'
def form_valid(self, form, *args, **kwargs):
self.object = form.save(commit=False)
self.object.user = self.request.user
slug = self.kwargs('slug')
print(slug)
self.object.post = get_object_or_404(Post, slug=slug)
self.object.save()
return super().form_valid(form)
views.py 第三次尝试
@login_required
def add_comment_to_post(request, slug):
print(slug)
post = get_object_or_404(Post, slug=slug)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.author = request.user
comment.save()
return redirect('posts:single', username=comment.author.username, slug=post.slug)
else:
form = CommentForm()
return render(request, 'posts/comment_form.html', {'form': form})
也将 url 更改为
url(r'^add_comment/(?P<slug>[\w-]+)/$', views.add_comment_to_post, name='add_comment'),
下面是 PostDetail 视图,url 它们工作完美
class PostDetail(SelectRelatedMixin, DetailView):
model = Post
select_related = ('user', 'group')
def get_queryset(self):
queryset = super().get_queryset()
return queryset.filter(user__username__iexact=self.kwargs.get('username'))
#below is the url
url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/$', views.PostDetail.as_view(), name='single'),
我在所有 3 个视图中收到与下面相同的 错误消息 ,并且 url
Page not found (404)
Request Method: GET
Request URL: http://127.0.0.1:8000/posts/...
Raised by: posts.views.PostDetail
所以我希望您的项目中有一个 urls.py
,其中您为您的应用程序(可能命名为帖子)添加了 urls.py
。项目 urls.py
可能看起来像这样:
(r'^posts/', include('project.posts.urls'))
然后在你的应用程序中 urls.py 你有你发给我的东西:
url(r'^(?P<slug>[-\w]+)/add_comment/$', views.add_comment_to_post, name='add_comment'),
url(r'^(?P<pk>\d+)/remove_comment/$', views.remove_comment, name='remove_comment'),
我个人将此更改为 slug 和主键将位于 URL 末尾的版本,如下所示:
url(r'^add_comment/(?P<slug>[-\w]+)/$', views.add_comment_to_post, name='add_comment')
url(r'^remove_comment/(?P<pk>\d+)/$', views.remove_comment, name='remove_comment'),
那么您添加新评论的 URL 将类似于 http://127.0.0.1:8000/posts/add_comment/how-to-be-a-good-developer/
。 URL 的最后一部分是你的 slug,你应该在你的数据库中有一个 Post 和这个 slug,因为如果你使用 get_object_or_404
函数和你的任何 Post你不会收到发送的 slug 你会收到 404。
如何在 Django 中轻松调试代码
您可能 运行 从控制台(命令行)使用命令 python manage.py runserver
的 Django 项目。在这个控制台中 运行ning 是一个小型开发服务器(与您可能知道的其他应用程序服务器非常相似)。如果您将 print()
语句添加到您的代码中,那么输出将通过标准输出发送(在本例中为您启动开发服务器的控制台)。因此,如果您在 URL 上发送请求,则可以添加打印语句以轻松调试问题。尝试这样的事情:
@login_required
def add_comment_to_post(request, slug):
print('I am here in your view')
print('This is my slug: {}'.format(slug))
post = get_object_or_404(Post, slug=slug)
print('This is my post: {}'.format(post))
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.author = request.user
comment.save()
return redirect('posts:single', username=comment.author.username, slug=post.slug)
else:
form = CommentForm()
return render(request, 'posts/comment_form.html', {'form': form})
现在,如果您将在您的控制台中看到 I am here in your view
Post 请求已成功解决并且视图为 运行ning。这次你知道你的 urls.py
很好。
如果您将看到消息 This is my slug: {your slug from url}
,您可以检查 slug 值并检查您的数据库中是否有 Post 这个 slug。
最后一件事要检查。如果您将在控制台中看到 This is my post: {post object}
,您就知道 Django select 是正确的 Post,问题出在视图的下一个代码中(我不希望如此)。如果您在控制台中看到 None 对象或 404 或任何错误,您可能没有 Post 和您在数据库中 URL 中发送的 slug。
如果您有任何疑问或想讨论控制台中的一些输出,您可以发表评论:-)
是的!!!知道了。我的头上有一些绷带,墙上也有一些裂缝,但我终于得到了很多 it.Thanks @Bulva 指导我正确的方向
urls.py应该是
url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/add_comment/$', views.CommentCreate.as_view(), name='add_comment'),
因为我们需要 post 发表评论的人的用户名以及必须 post 发表评论的 post。上面的url既有
views.py应该如下
class CommentCreate(LoginRequiredMixin, CreateView):
model = Comment
form_class = CommentForm #In the second attempt above I used a template name. which is incorrect we should either use a formclass from forms.py or use "fields = text"
def form_valid(self, form, *args, **kwargs):
self.object = form.save(commit=False)
self.object.author = self.request.user #I used self.object.user instead of self.object.author. since the models call the "user" as "author". I changed this
slug = self.kwargs.get('slug') #I added the .get without which you get a "'dict' object is not callable" error
print(slug)
self.object.post = get_object_or_404(Post, slug=slug)
self.object.save()
return super().form_valid(form)
哦,是的,最后但并非最不重要的是在您的模板中。下面是如何添加评论按钮。我相信你们中的很多聪明人都不需要它。但是,嘿,不疼吧!如果您不使用 bootstrap,请从锚标记
中删除 "class"
<a class="btn btn-primary comment_button" href="{% url 'posts:add_comment' username=post.user.username slug=post.slug %}">Add Comment</a>
嗨,Djangonauts 我是 Django 的新手,如果我的代码中有愚蠢的错误,请原谅我,我目前正在尝试向我的 post 模型添加评论
下面是我的models.py
class Post(models.Model):
user = models.ForeignKey(User, related_name='posts')
title = models.CharField(max_length=250, unique=True)
slug = models.SlugField(allow_unicode=True, unique=True)
message = models.TextField()
def get_absolute_url(self):
return reverse('posts:single', kwargs={'username': self.user.username, 'slug': self.slug})
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super().save(*args, **kwargs)
class Comment(models.Model):
post = models.ForeignKey(Post, related_name='comments')
author = models.ForeignKey(User, related_name='comments')
text = models.TextField()
def get_absolute_url(self):
return reverse('posts:single', kwargs={'username': self.post.user.username,
'slug': self.post.slug})
views.py 第一次尝试
@login_required
def add_comment_to_post(request, slug):
post = get_object_or_404(Post, slug=slug)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.author = request.user
comment.save()
return redirect('posts:single', username=comment.author.username, slug=post.slug)
else:
form = CommentForm()
return render(request, 'posts/comment_form.html', {'form': form})
@login_required
def remove_comment(request, pk):
comment = get_object_or_404(Comment, pk=pk)
comment.author = request.user
post_slug = comment.post.slug
comment.delete()
return redirect('posts:single', username=request.user.username, slug=post_slug)
urls.py
url(r'^(?P<slug>[-\w]+)/add_comment/$', views.CommentCreate.as_view(), name='add_comment'),
我还有下面的 FBV urls 它们都给我同样的错误
url(r'^(?P<slug>[-\w]+)/add_comment/$', views.add_comment_to_post, name='add_comment'),
url(r'^(?P<pk>\d+)/remove_comment/$', views.remove_comment, name='remove_comment'),
Views.py 第二次尝试
class CommentCreate(LoginRequiredMixin, CreateView):
model = Comment
fields = ('text',)
form_class = 'posts/comment_form.html'
def form_valid(self, form, *args, **kwargs):
self.object = form.save(commit=False)
self.object.user = self.request.user
slug = self.kwargs('slug')
print(slug)
self.object.post = get_object_or_404(Post, slug=slug)
self.object.save()
return super().form_valid(form)
views.py 第三次尝试
@login_required
def add_comment_to_post(request, slug):
print(slug)
post = get_object_or_404(Post, slug=slug)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.author = request.user
comment.save()
return redirect('posts:single', username=comment.author.username, slug=post.slug)
else:
form = CommentForm()
return render(request, 'posts/comment_form.html', {'form': form})
也将 url 更改为
url(r'^add_comment/(?P<slug>[\w-]+)/$', views.add_comment_to_post, name='add_comment'),
下面是 PostDetail 视图,url 它们工作完美
class PostDetail(SelectRelatedMixin, DetailView):
model = Post
select_related = ('user', 'group')
def get_queryset(self):
queryset = super().get_queryset()
return queryset.filter(user__username__iexact=self.kwargs.get('username'))
#below is the url
url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/$', views.PostDetail.as_view(), name='single'),
我在所有 3 个视图中收到与下面相同的 错误消息 ,并且 url
Page not found (404)
Request Method: GET
Request URL: http://127.0.0.1:8000/posts/...
Raised by: posts.views.PostDetail
所以我希望您的项目中有一个 urls.py
,其中您为您的应用程序(可能命名为帖子)添加了 urls.py
。项目 urls.py
可能看起来像这样:
(r'^posts/', include('project.posts.urls'))
然后在你的应用程序中 urls.py 你有你发给我的东西:
url(r'^(?P<slug>[-\w]+)/add_comment/$', views.add_comment_to_post, name='add_comment'),
url(r'^(?P<pk>\d+)/remove_comment/$', views.remove_comment, name='remove_comment'),
我个人将此更改为 slug 和主键将位于 URL 末尾的版本,如下所示:
url(r'^add_comment/(?P<slug>[-\w]+)/$', views.add_comment_to_post, name='add_comment')
url(r'^remove_comment/(?P<pk>\d+)/$', views.remove_comment, name='remove_comment'),
那么您添加新评论的 URL 将类似于 http://127.0.0.1:8000/posts/add_comment/how-to-be-a-good-developer/
。 URL 的最后一部分是你的 slug,你应该在你的数据库中有一个 Post 和这个 slug,因为如果你使用 get_object_or_404
函数和你的任何 Post你不会收到发送的 slug 你会收到 404。
如何在 Django 中轻松调试代码
您可能 运行 从控制台(命令行)使用命令 python manage.py runserver
的 Django 项目。在这个控制台中 运行ning 是一个小型开发服务器(与您可能知道的其他应用程序服务器非常相似)。如果您将 print()
语句添加到您的代码中,那么输出将通过标准输出发送(在本例中为您启动开发服务器的控制台)。因此,如果您在 URL 上发送请求,则可以添加打印语句以轻松调试问题。尝试这样的事情:
@login_required
def add_comment_to_post(request, slug):
print('I am here in your view')
print('This is my slug: {}'.format(slug))
post = get_object_or_404(Post, slug=slug)
print('This is my post: {}'.format(post))
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.author = request.user
comment.save()
return redirect('posts:single', username=comment.author.username, slug=post.slug)
else:
form = CommentForm()
return render(request, 'posts/comment_form.html', {'form': form})
现在,如果您将在您的控制台中看到 I am here in your view
Post 请求已成功解决并且视图为 运行ning。这次你知道你的 urls.py
很好。
如果您将看到消息 This is my slug: {your slug from url}
,您可以检查 slug 值并检查您的数据库中是否有 Post 这个 slug。
最后一件事要检查。如果您将在控制台中看到 This is my post: {post object}
,您就知道 Django select 是正确的 Post,问题出在视图的下一个代码中(我不希望如此)。如果您在控制台中看到 None 对象或 404 或任何错误,您可能没有 Post 和您在数据库中 URL 中发送的 slug。
如果您有任何疑问或想讨论控制台中的一些输出,您可以发表评论:-)
是的!!!知道了。我的头上有一些绷带,墙上也有一些裂缝,但我终于得到了很多 it.Thanks @Bulva 指导我正确的方向
urls.py应该是
url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/add_comment/$', views.CommentCreate.as_view(), name='add_comment'),
因为我们需要 post 发表评论的人的用户名以及必须 post 发表评论的 post。上面的url既有
views.py应该如下
class CommentCreate(LoginRequiredMixin, CreateView):
model = Comment
form_class = CommentForm #In the second attempt above I used a template name. which is incorrect we should either use a formclass from forms.py or use "fields = text"
def form_valid(self, form, *args, **kwargs):
self.object = form.save(commit=False)
self.object.author = self.request.user #I used self.object.user instead of self.object.author. since the models call the "user" as "author". I changed this
slug = self.kwargs.get('slug') #I added the .get without which you get a "'dict' object is not callable" error
print(slug)
self.object.post = get_object_or_404(Post, slug=slug)
self.object.save()
return super().form_valid(form)
哦,是的,最后但并非最不重要的是在您的模板中。下面是如何添加评论按钮。我相信你们中的很多聪明人都不需要它。但是,嘿,不疼吧!如果您不使用 bootstrap,请从锚标记
中删除 "class"<a class="btn btn-primary comment_button" href="{% url 'posts:add_comment' username=post.user.username slug=post.slug %}">Add Comment</a>