You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何基于is_published布尔值实现用户主页帖子权限控制?

问题解答

应该在views.py中实现这个需求,而非模板层,原因如下:

  1. 职责划分更清晰:按照Django的MVC设计思路,视图层负责处理业务逻辑、过滤数据,模板只专注于数据渲染。把帖子过滤逻辑放在视图里,能让代码分工明确,后续维护和调整更省心。
  2. 安全性有保障:如果在模板里过滤草稿内容,意味着草稿数据已经被传到前端了,懂技术的用户可以通过页面源码、调试工具拿到这些未公开的内容,存在数据泄露风险。在视图层提前过滤的话,草稿数据根本不会被传到前端,从根源上避免了这个问题。
  3. 性能更高效:视图层直接在数据库层面过滤数据,只会查询需要的记录,减少了数据库返回的数据量,也降低了前后端传输的数据大小,比把所有数据查出来再在前端过滤要高效得多。

修改后的views.py代码示例:

# views.py
class UserView(TemplateView):
    def get(self, request, username=None):
        if username is None:
            user = request.user
        else:
            user = User.objects.get(username=username)

        # 根据访问者身份过滤帖子
        if request.user == user:
            # 作者自己访问,显示所有帖子(含草稿)
            posts = Post.objects.filter(owner=user).all()
        else:
            # 其他用户访问,仅显示已发布帖子
            posts = Post.objects.filter(owner=user, is_published=True).all()

        context = {"user": user, "posts": posts}
        return render(request, "base/user_view.html", context)

另外提两个原代码里的小问题:

  • Post模型save方法中,slugify(self. Title)多了个空格,应该写成slugify(self.title)
  • 获取当前登录用户时,直接用request.user即可,无需再通过User.objects.get查询一次数据库

内容的提问来源于stack exchange,提问作者Yousef Ayash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 23:30:23