【问题标题】:Make readable the post only if the user is staff仅当用户是员工时才使帖子可读
【发布时间】: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


【解决方案1】:

感谢@RaideR 的指示,我已经解决了我的问题。

def singlePost(request, slug_post, slug_category):
    post_category = get_object_or_404(BlogCategory, slug_category=slug_category)
    if not request.user.is_staff:
         post_filter = BlogPost.objects.filter(
                        draft=False,
                        publishing_date__lt=datetime.datetime.now()
                        )
    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)

【讨论】:

    猜你喜欢
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多