我的情况是允许三种类型的用户访问管理界面: -管理员 -主管 -代理商
这是一个按等级划分的情况,管理员是一个(超级用户),它创建了主管,而主管则创建了代理。
他们所有人都可以使用专有授权登录django管理员。
登录名已由“ django.contrib.auth”使用默认模型auth_user(。
from django.contrib.auth.models import User
class Supervisor(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
e_mail = models.EmailField(max_length=60, db_column='E-Mail',blank=True)
...other fields....
class Admin(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
e_mail = models.EmailField(max_length=60, db_column='E-Mail',blank=True)
...other fields...
但是,有一个问题。如果我允许主管创建代理,则意味着我必须将授权添加到ADD并更改USER表。这很危险,任何主管都可能成为超级用户,删除用户等。
如何解决此问题?可以允许主管创建代理而不使他变得危险吗?
谢谢
编辑
我对类的定义期间在models.py中存有疑问...我编写了此方法:
def save(self):
self.user.is_staff = True
self.user.save()
super(Agent, self).save()
在Java中,EJB的方法是事务性/原子性的(提交是自动的)...在Django中,我必须调用方法save()。
这是一个与以前不同的问题.....
答案 0 :(得分:0)
不知道我是否要了解您的问题。但是,如果这样做,您可以编辑用户创建表单。
@admin.register(User)
class UserAdmin(BaseUserAdmin):
view_on_site = False
list_display = ('username', 'first_name', 'last_name', 'is_active', 'is_staff', 'date_joined', 'last_login')
list_filter = ('is_staff', )
fieldsets = (
('Data', {'fields': ('username', 'email', 'first_name', 'last_name', 'password')}),
('Activation/Deactivation', {'fields': ('is_active', )}),
('Permissions', {'fields': ('is_staff', 'groups', )})
)
由于superuser
不再是一种选择,因此您的主管不能成为超级用户。
让我知道是否有帮助。也许我们可以更接近解决方案了。