Django: DRY principle and UserPassesTestMixin
我有一个名为
这就是说,我在视图中使用
当我使用django:generic编辑视图时,文档说我需要使用django:userpassestmixin。
将对
因为这是我尝试过但没有成功的,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | from django.views.generic.edit import UpdateView from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import UserPassesTestMixin class TestUserOwnerOfPost(UserPassesTestMixin): def test_func(self): return self.request.user == self.post.owner class EditPost(UpdateView, TestUserOwnerOfPost): model = Post @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super(EditPost, self).dispatch(*args, **kwargs) |
通过以上代码,系统中的每个登录用户都可以在任何岗位上进行
正如@rafalmp所说,第一个问题是您继承的类的顺序不正确。
但是,解决这一问题并不能解决问题,因为
一种选择是在测试函数内部调用
1 2 3 | def test_func(self): self.object = self.get_object() return self.request.user == self.object.owner |
号
另一种方法是重写
1 2 3 4 5 6 | class OwnerQuerysetMixin(object): def get_queryset(self): queryset = super(OwnerQuerysetMixin, self).get_queryset() # perhaps handle the case where user is not authenticated queryset = queryset.filter(owner=self.request.user) return queryset |
你从事物继承的类的顺序。要使访问控制正常工作,必须在执行UpdateView之前强制执行:
1 | class EditPost(TestUserOwnerOfPost, UpdateView): |