所以我添加了一个一对一的字段来扩展Django auth用户模型:
class Employee(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
division = models.ForeignKey(Division, on_delete=models.CASCADE)
我想实现的是每个Employee都有权限修改其他Employee对象,但仅限于同部门的。
我创建了一个“员工”权限组,具有添加/更改/删除用户和员工对象的权限。
现在每个员工对所有 员工和所有 用户对象都有“可以更改”权限。
我设法过滤了 OneToOneField 上的 django 管理更改列表,因此每个员工只能在更改列表中看到他们自己部门的员工。
问题是,如果他们手动输入用于更改另一个部门的用户的 URL,他们就能够更改/删除该用户。同样,他们甚至可以更改/删除 super 用户(用户 1)。导航到:
http://localhost:8000/admin/auth/user/1/change/
会成功的。
我想解决这个问题是覆盖 auth 用户更改方法,添加一个“部门或 super 用户”检查,但这看起来很老套。我更愿意根据划分来限制对更改 URL 的访问,但我还没有找到实现此目的的方法。
感谢您的任何建议!
请您参考如下方法:
您可以使用 UserPassesTestMixin在基于类的 View 中强制当前用户针对她/他试图更改的员工部门进行测试。
假设 change 方法是以下示例的 POST 方法:
from django.contrib.auth.mixins import UserPassesTestMixin
class MyView(UserPassesTestMixin, View):
def test_func(self):
ch_user_division = Employee.objects.filter(
pk=self.request.POST.get('user_id')
).values('division')
return self.request.user.division == ch_user_division
现在基于类的 MyView 检查用户是否与要更改的用户在同一部门。
有关如何限制用户访问的更多信息:https://docs.djangoproject.com/en/1.11/topics/auth/default/#limiting-access-to-logged-in-users-that-pass-a-test
出于评论遗留原因留下以下内容:
您可以使用 ForeignKey.limit_choices_to关于模型定义的参数,其中:
Sets a limit to the available choices for this field when this field is rendered using a
ModelFormor theadmin.
尝试以下操作:
class Employee(models.Model):
user = models.OneToOneField(
User,
on_delete=models.CASCADE,
limit_choices_to={'division': division}
)
division = models.ForeignKey(Division, on_delete=models.CASCADE)
