Django中如何基于is_published布尔值实现用户主页帖子权限控制?
问题解答
应该在views.py中实现这个需求,而非模板层,原因如下:
- 职责划分更清晰:按照Django的MVC设计思路,视图层负责处理业务逻辑、过滤数据,模板只专注于数据渲染。把帖子过滤逻辑放在视图里,能让代码分工明确,后续维护和调整更省心。
- 安全性有保障:如果在模板里过滤草稿内容,意味着草稿数据已经被传到前端了,懂技术的用户可以通过页面源码、调试工具拿到这些未公开的内容,存在数据泄露风险。在视图层提前过滤的话,草稿数据根本不会被传到前端,从根源上避免了这个问题。
- 性能更高效:视图层直接在数据库层面过滤数据,只会查询需要的记录,减少了数据库返回的数据量,也降低了前后端传输的数据大小,比把所有数据查出来再在前端过滤要高效得多。
修改后的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
相关产品推荐
相关产品推荐

