You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django类视图权限调整:仅允许premium组用户访问BookDetailView

实现BookDetailView仅允许"premium"用户组访问的修改方案

方法一:重写PermissionRequiredMixin的has_permission方法

保留原有的PermissionRequiredMixin,通过重写has_permission方法来检查用户组归属:

修改BookDetailView类如下:

class BookDetailView(PermissionRequiredMixin, DetailView):
    """Generic class-based detail view for a book."""
    model = Book
    template_name = "catalog/permission_required.html"

    def has_permission(self):
        # 验证当前用户是否属于"premium"用户组
        return self.request.user.groups.filter(name='premium').exists()

方法二:改用UserPassesTestMixin

如果希望逻辑更直观,可以替换为UserPassesTestMixin,重写test_func方法:

首先导入UserPassesTestMixin:

from django.contrib.auth.mixins import UserPassesTestMixin

然后修改BookDetailView:

class BookDetailView(UserPassesTestMixin, DetailView):
    """Generic class-based detail view for a book."""
    model = Book
    template_name = "catalog/permission_required.html"

    def test_func(self):
        # 验证当前用户是否属于"premium"用户组
        return self.request.user.groups.filter(name='premium').exists()

额外优化:允许超级用户访问

如果需要让超级用户也能访问该页面,可以在判断逻辑中加入超级用户验证:

# 方法一中的has_permission修改
def has_permission(self):
    return self.request.user.is_superuser or self.request.user.groups.filter(name='premium').exists()

# 方法二中的test_func修改
def test_func(self):
    return self.request.user.is_superuser or self.request.user.groups.filter(name='premium').exists()

注意事项

  • 确保已在Django后台创建名为premium的用户组,并将需要授权的用户添加至该组。
  • 用户无权限时,Django默认返回403页面,可通过设置raise_exception=True或自定义handle_no_permission方法调整无权限行为。

内容的提问来源于stack exchange,提问作者Zembla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:15:58