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

Django中如何定义可像user.is_superuser一样调用的自定义用户组判断方法?

问题1:这类判断函数的规范叫法

这类用于判断对象状态、返回布尔值的函数/方法,规范叫法是谓词方法(Predicate Method),def只是Python中定义函数的关键字,不是这类方法的名称。


核心问题失效原因

你的写法存在两个错误:

  1. 方法归属错误:你把is_approver定义在了ModelAdmin类内部,它是ModelAdmin的实例方法,不属于Django的User模型。request.user是User模型的实例,自然找不到这个方法,调用必然失效。
  2. 调用语法错误:就算你把方法正确绑定到了User模型上,你写的request.user.is_approver没有加括号,拿到的是方法对象本身而非执行后的布尔值,if判断会始终返回True,无法得到预期结果。
    另外注意你代码里的组名前后不一致:方法中过滤的组名是approver,直接写逻辑时用的是approvers,多了后缀s,这也是容易出错的小细节。

解决方案

方案1:不改User模型,直接在ModelAdmin内调用

因为is_approver是当前ModelAdmin的方法,直接在get_fieldsets中通过self调用即可:

def get_fieldsets(self, request, obj=None):
    if self.is_approver(request.user):
        return self.approver_fieldset

方案2:实现和is_superuser完全一致的调用效果

如果你想直接用request.user.is_approver的调用方式,需要把这个逻辑绑定为User模型的属性:
如果你使用自定义用户模型,直接在模型类中添加带@property装饰器的方法即可:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    @property
    def is_approver(self):
        return self.groups.filter(name='approver').exists()

如果使用Django默认的User模型,可以通过扩展用户Profile或者使用属性注入的方式实现,效果和内置的is_superuser属性完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:48:08