django - Django 用户访问控制
问题描述
例如,我有一个模型Post
。
class Post(models.Model):
task = models.ForeignKey("User")
我希望用户只能访问自己创建的帖子,但有太多视图列出了一些帖子以在每个视图中重写查询集。
那么有没有什么优雅的方式来控制用户访问呢?在线程中保存并获取当前用户并实现一个新Manager
类Post
是一种方法,但我不知道为什么不推荐这样做。
解决方案
假设您使用的是通用ListView
(Django-doc)。您可以覆盖视图的get_queryset(...)
(Django-doc)方法,如下所示,
class PostListView(ListView):
def get_queryset(self):
return Post.objects.filter(task=self.request.user)
通用解决方案
首先你需要创建一个mixin类,
class GenericLoggedInMixin:
user_field_name = None
def get_queryset(self):
queryset = super().get_queryset()
if self.user_field_name:
return queryset.filter(**{self.user_field_name: self.request.user})
return queryset
并在您看来继承相同,
class PostListView(GenericLoggedInMixin, ListView):
user_field_name = 'task'
推荐阅读
- java - Log4j 版本 1 自定义 Throwable (stacktrace) 渲染器,用于删除换行符
- python - 确定两个字符串的排列
- python - 如何生成整数的 n 位组合?
- javascript - 如何从选择的 div 覆盖图像
- html - HTML在div中创建2行内容
- http - Gatling http请求未执行
- python - 为什么 (x & 0) 与 (x & ~1) 不同?
- javascript - 未报告 Google Analytics 事件跟踪
- node.js - 使用 Node.js Sharp 将 JPG 转换为 Webp
- ethereum - 当我想部署 giveth.yo 时 Netlify 出错