Django - 用户权限如何控制特定视图?

25 投票
5 回答
42574 浏览
提问于 2025-04-16 09:24

从管理员的角度来看,你可以给用户或用户组分配权限,让他们可以添加、修改或删除模型中的数据。

这很好,但我还需要允许用户或用户组访问某些视图,或者不允许他们访问。我网站上有一些特定类型的服务,所以我想让某些用户可以访问特定的服务(页面/视图),而其他用户则不能。

那么,我该如何让某些用户或用户组访问特定的视图呢?谢谢!

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):
    # ...

通过使用权限,你可以很方便地在管理界面上给用户和组添加或移除权限。

撰写回答