【发布时间】:2019-11-26 02:43:23
【问题描述】:
我正在开发博客的后端,我需要区分帖子的类型:已发布、未来的帖子、草稿时间>。为此,我从过去请求中的指示开始:
在我意识到所有类型的帖子总是在线感谢this solution之后,我只能将已发布的帖子放到网上。
在我的博客中有两种用户类型:is_staff(默认的 Django 类型),is_user(在我的注册模型中)。还有另一种类型是匿名用户,即没有任何类型注册的用户使用 Google 或其他解决方案到达我的博客。
因此,我开发了一个视图,仅当用户是 is_staff 但我看到 Forbidden 错误 时才显示草稿和未来的帖子。
def singlePost(request, slug_post, slug_category):
post_category = get_object_or_404(BlogCategory, slug_category=slug_category)
post_filter = BlogPost.objects.filter(draft=False, publishing_date__lt=datetime.datetime.now())
if not request.user.is_authenticated:
post_filter = BlogPost.objects.filter(draft=False, publishing_date__lt=datetime.datetime.now())
raise PermissionDenied
elif request.user.is_user:
post_filter = BlogPost.objects.filter(draft=False, publishing_date__lt=datetime.datetime.now())
raise PermissionDenied
else:
post_filter = BlogPost.objects.all()
post_details = get_object_or_404(post_filter, slug_post=slug_post)
category_post_details = BlogPost.objects.filter(post_category=post_category)
context = {
"post_category": post_category,
"post_details": post_details,
"category_post_details": category_post_details,
}
template = 'blog/reading/single_post.html'
return render(request, template, context)
我该如何解决? 自己制作个人博客是一个了解 Python 和 Django 的机会。
注意:视图以这种方式工作正常
def singlePost(request, slug_post, slug_category):
post_category = get_object_or_404(BlogCategory, slug_category=slug_category)
post_details = get_object_or_404(BlogPost, slug_post=slug_post)
category_post_details = BlogPost.objects.filter(post_category=post_category)
context = {
"post_category": post_category,
"post_details": post_details,
"category_post_details": category_post_details,
}
template = 'blog/reading/single_post.html'
return render(request, template, context)
注意: 我想获得的是像 Wordpress 这样的后端。使用 WordPress 你可以创建一个草稿或预定的帖子,这种类型的帖子不是 在线并仅对登录用户可读。
【问题讨论】:
-
如果用户没有通过
is_user的身份验证,你为什么要raise PermissionDenied?我认为您将立即离开该方法 - 这是您的预期行为吗? -
我想获得的是像 Wordpress 这样的后端。使用 Wordpress,您可以创建草稿或预定帖子,此类帖子不在线,并且只有登录用户才能阅读。
-
让我们看一下代码中的
if not request.user.is_authenticated语句。如果用户未通过身份验证,您将声明变量post_filter无效,因为之后您会引发PermissionDenied异常,该异常将立即离开该方法。
标签: django django-views django-permissions django-2.2