【发布时间】:2018-10-10 00:04:24
【问题描述】:
嗨 Djangonauts 我是 Django 新手,如果我的代码中有愚蠢的错误,请原谅我,我目前正在尝试将 cmets 添加到我的帖子模型中
以下是我的 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 的网址,它们都给了我同样的错误
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(r'^add_comment/(?P<slug>[\w-]+)/$', views.add_comment_to_post, name='add_comment'),
下面是 PostDetail 视图和网址,它们完美运行
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 编辑答案吗?
-
@Bulva 如果您需要比我在问题中提供的更多信息,请告诉我。我添加了尽可能多的信息而没有让问题太长,但我很乐意提供任何可以帮助解决这个问题的信息
-
@Bulva 还添加了我在上述问题中使用的 url,并编辑了标签以包含 Django-urls
-
最好将 slug 和 pk 移到 url 的末尾。例如:url(r'^add_comment/(?P
[\w-]+)/$', 'views.add_comment_to_post', name='add_comment')。然后,如果您在一个好的 url 上发送一个好的请求,那么您可能没有正确的 slug 的帖子。您可以在视图中使用 print() 来调试显示错误的位置。 -
例如在 post = get_object_or_404(Post, slug=slug) 之前添加 print(slug) 并检查 slug。如果您将在控制台中显示 slug,您就知道问题出在打印之后。如果您的控制台中没有 slug,您可能会在错误的 url 上发送请求。没有机会尝试所有代码,很难调试
标签: python django python-3.x django-views django-urls