防止超级用户在Django Admin中删除/删除/编辑用户电子邮件

时间:2017-12-06 07:46:03

标签: python django django-allauth

我正在使用django-allauth进行用户注册和登录。用户可以使用用户名和电子邮件登录。

# settings.py

# Custom User Model
AUTH_USER_MODEL = 'users.User'

# ask for either username or email during login
ACCOUNT_AUTHENTICATION_METHOD = 'username_email'
# Set Email field as required during signup
ACCOUNT_EMAIL_REQUIRED = True
# Set email versification necessary before creating account
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
# Don't ask for username while signing up.
# Users can later edit/change username in their profile.
# If username is not set, use email to log in.
ACCOUNT_USERNAME_REQUIRED = False
# Login the user after email-confirmations
ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = True

我有一个用户应用程序,它实现了一个自定义用户模型,如图所示。

# users/models.py

class User(AbstractUser):

    name = models.CharField(blank=True, max_length=255)

    def __str__(self):
        return self.username

    def get_absolute_url(self):
        return reverse('users:detail', kwargs={'username': self.username})

使用此设置,我可以通过电子邮件和用户名进行用户登录。但是,问题在于Superuser能够在Django Admin中编辑/删除“email”。我不想要这样的行为。 (尝试删除用户名会产生“需要字段”错误。)

我现在的问题是, 如何阻止管理员编辑用户信息。,即将“用户名”和“电子邮件”设为只读字段。

2 个答案:

答案 0 :(得分:1)

嗯,超级用户是系统中最有权限的用户。 超级用户可以绝对访问所有内容,这是合乎逻辑的。

如果您希望用户只拥有部分访问权限,可以通过创建新的管理员组并将管理员添加到该组来实现。删除权限以修改该组的用户表。

答案 1 :(得分:1)

您可以为用户制作自定义模型管理员并添加readonly_fields = ('email',)

@admin.register(User)
class UserAdmin(DjangoUserAdmin):


fieldsets = (
    (None, {'fields': ('email', 'password')}),
    (_('Personal info'), {'fields': ('first_name', 'last_name')}),
    (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser','role',
                                   'groups', 'user_permissions')}),
    (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
add_fieldsets = (
    (None, {
        'classes': ('wide',),
        'fields': ('email', 'password1', 'password2'),
    }),
)
list_display = ('email', 'first_name', 'last_name', 'is_staff')
search_fields = ('email', 'first_name', 'last_name')
ordering = ('email',)
readonly_fields = ('email',)