Django中如何定义可像user.is_superuser一样调用的自定义用户组判断方法?
问题1:这类判断函数的规范叫法
这类用于判断对象状态、返回布尔值的函数/方法,规范叫法是谓词方法(Predicate Method),def只是Python中定义函数的关键字,不是这类方法的名称。
核心问题失效原因
你的写法存在两个错误:
- 方法归属错误:你把
is_approver定义在了ModelAdmin类内部,它是ModelAdmin的实例方法,不属于Django的User模型。request.user是User模型的实例,自然找不到这个方法,调用必然失效。 - 调用语法错误:就算你把方法正确绑定到了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
相关产品推荐
相关产品推荐

