django - Django 限制用户访问相关对象
问题描述
我正在编写一个应用程序,它允许用户仅在其组织内验证和查看对象。对于 a generic.ListView
,我可以使用以下代码限制访问:
模型.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
organisation = models.ForeignKey('Organisation', null=True, on_delete=models.CASCADE)
class Organisation(models.Model):
name = models.CharField(max_length=255, unique=True, null=False, verbose_name="Name")
视图.py
class OrganisationList(LoginRequiredMixin, generic.ListView):
model = Organisation
def get_queryset(self):
return Organisation.objects.filter(id=self.request.user.organisation.id)
除了这个视图,用户还可以访问需要这个限制的表单、API 和 django 管理界面。
例如,用户 Brett 属于 Kids Incorporated。当他登录到管理面板时,他目前还可以看到 ACME Corporation,但应该不能这样做。
我查看了ModelManager
界面,但不确定如何获取用户请求并覆盖是否有一种方法可以为所有视图(DRY)运行编写一个查询,以便用户只能看到他们自己的组织?
解决方案
有一种方法。
- 安装
django-crequest
包:https ://github.com/Alir3z4/django-crequest#installing - 在 models.py 中创建一个
model.Manager
并覆盖该get_queryset
方法
模型.py
...
from crequest.middleware import CrequestMiddleware
class UserOrganisationManager(models.Manager):
def get_queryset(self):
request = CrequestMiddleware.get_request()
return super().get_queryset().filter(id=request.user.organisation.id)
class Organisation(models.Model):
name = models.CharField(max_length=255,
unique=True, null=False, verbose_name="Name")
...
objects = UserOrganisationManager()
推荐阅读
- java - JDK 8 没有指向正确的路径
- java - MapReduce:计算产品的平均评分和评论总数
- python - 将 2 个 numpy 数组相乘
- c++ - DirectX12 的问题:“d3dApp.h”:没有这样的文件或目录
- r - 如何基于大数据帧计算共现矩阵?
- delphi - 使用 Delphi-Mocks 通过私有记录在 DUnitx 中进行测试
- tensorflow - 为 Tensorflow 自动分配 CUDA 设备
- windows - 如何在 Windows 的 package.json 中的 NPM 脚本中关闭终端?
- angular - 垫自动完成不过滤值
- node.js - 如何配置 Apollo Server PubSub eventEmitter 在超过最大侦听器时抛出或记录错误?