是否可以通过选择组来选择is_staff?我们假设有两组:用户,管理员
当新用户在用户组中时,他不是员工,但如果他在管理员组中,则他是员工。
答案 0 :(得分:2)
有一种简单的方法可以在用户模型中定义以下内容
@property
def is_staff(self):
if self.is_staff == True or self.groups.filter(name="staff").exists()
因此,在管理员登录期间或从user_object.is_staff调用的任何其他时间您也将获得基于组的所需内容。
答案 1 :(得分:1)
I managed to make it work by extending the UserAdmin class and in the get_form function I placed this with help of mascot6699's answer:
if obj.groups.filter(name="Administrator").exists():
obj.is_staff = True
else:
obj.is_staff = False
So whenever I place a user (with the admin menu) in the Administrator group it will check the is_staff option else it unchecks it.
答案 2 :(得分:1)
is_staff
属性主要由管理界面使用。如果您希望有一个依赖于组成员身份的管理界面,则可以改写AdminSite.has_permission()来代替:
class GroupBasedAdminSite(admin.AdminSite):
def has_permission(self, request):
return request.user.is_active and request.user.groups.filter(name = 'admins').exists()
# override default admin site
admin.site = GroupBasedAdminSite()
如果您要支持不同类型的“管理员”,也可以use the official override feature,或在专用路径上托管专用的GroupBasedAdminSite。
答案 3 :(得分:0)
有两个地方应该重写以实现此行为
# inside any app's admin.py module
import types
from django.contrib import admin
from django.contrib.admin.forms import AdminAuthenticationForm
def has_permission(self, request):
return request.user.is_active and (
request.user.is_staff
or request.user.groups.filter(name="grp").exists()
)
class GrpAdminAuthenticationForm(AdminAuthenticationForm):
def confirm_login_allowed(self, user):
if user.groups.filter(name="grp").exists():
user.is_staff = True
super().confirm_login_allowed(user)
admin.site.login_form = GrpAdminAuthenticationForm
admin.site.has_permission = types.MethodType(has_permission, admin.site)
它将更新默认的 admin.site 对象,因此无需注册到自定义对象。