Django - 用户权限如何控制特定视图?
从管理员的角度来看,你可以给用户或用户组分配权限,让他们可以添加、修改或删除模型中的数据。
这很好,但我还需要允许用户或用户组访问某些视图,或者不允许他们访问。我网站上有一些特定类型的服务,所以我想让某些用户可以访问特定的服务(页面/视图),而其他用户则不能。
那么,我该如何让某些用户或用户组访问特定的视图呢?谢谢!
5 个回答
4
对于基于类的视图,你可以把 UserPassesTestMixin
这个类继承到你的视图里面,然后定义一个叫 test_func
的函数。
from django.contrib.auth.mixins import UserPassesTestMixin
class MainView(UserPassesTestMixin, View):
def test_func(self):
return self.request.user.has_perm('app.get_main_view')
想了解更多使用方法,可以看看 这份文档。
10
你需要手动管理这个,但其实很简单。可以假设有一个属性,用来判断一个组是否有权限查看某个视图。然后你只需要用 permission_required
装饰器来装饰这个视图,如果只是简单地判断用户是否拥有某个权限;如果情况稍微复杂一点,就用 user_passes_test
:
@user_passes_test(lambda u: u.is_allowed_to_see_view_myview())
def myview(request):
...etc...
假设 is_allowed_to_see_view_myview
是用户对象上的某种方法。
认证文档 讲得很详细。
27
那些不能添加或修改某个模型的用户,在管理后台是看不到这个模型的。
如果我们说的是你自己创建的视图,你可以做一个检查,看看用户是否有权限,如果没有权限,就返回一个404错误页面。
权限是和模型相关联的,一个组可以被分配不同的权限。
你可以这样给一个模型添加权限:
# myproject/myapp/models.py
class MyModel(models.Model):
class Meta:
permissions = (
('permission_code', 'Friendly permission description'),
)
然后你可以这样检查一个用户是否有权限:
@user_passes_test(lambda u: u.has_perm('myapp.permission_code'))
def some_view(request):
# ...
通过使用权限,你可以很方便地在管理界面上给用户和组添加或移除权限。