Django-管理界面-允许为非超级用户创建用户

时间:2018-09-20 00:52:02

标签: python django admin roles superuser

我的情况是允许三种类型的用户访问管理界面: -管理员 -主管 -代理商

这是一个按等级划分的情况,管理员是一个(超级用户),它创建了主管,而主管则创建了代理。

他们所有人都可以使用专有授权登录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()。

这是一个与以前不同的问题.....

1 个答案:

答案 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不再是一种选择,因此您的主管不能成为超级用户。

让我知道是否有帮助。也许我们可以更接近解决方案了。