简化示例:
# foo/models.py
class Bar(models.Model):
author = models.ForeignKey(User)
# foo/views.py
class BarEditView(PermissionRequiredMixin, UpdateView):
permission_required = 'foo.change_bar'
model = Bar
success_url = '/'
我希望BarEditView可以通过以下方式访问:
- 在数据库中具有
foo.change_bar
权限的用户(该类的第一行已经完成) - 该Bar记录的作者
前者很容易由基本权限/组处理。我如何实现第二个目标?我需要编写一些自定义权限检查逻辑,但我在文档或谷歌中找不到任何内容。我不想要"手动"。每次设置/更改/删除一个Bar作者时,为数据库添加一个权限。
要明确的是,我不是在问如何创建自定义权限。我想尝试增加逻辑来确定谁有权限。是的,django.contrib.auth.mixins.UserPassesTestMixin
是我需要的!
# foo/models.py
class Bar(models.Model):
author = models.ForeignKey(User)
# foo/views.py
class BarEditView(UserPassesTestMixin, UpdateView):
model = Bar
success_url = '/'
def test_func(self):
if self.request.user.has_perm('foo.change_bar'):
return True
elif self.request.user == self.get_object().author:
return True
else:
return False