在 Django Admin 中阻止超级用户使用 deleting/removing/editing 用户电子邮件

Prevent Superuser from deleting/removing/editing User Email in Django Admin

我正在使用 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})

使用此设置,我可以通过电子邮件和用户名进行用户登录。然而,问题在于超级用户能够在 Django Admin 中 edit/remove 'email'。我不想要这样的行为。 (但尝试删除用户名会出现 "field required" 错误。)

我现在的问题是, 如何防止管理员编辑用户信息。 即使 'username' 和 'email' 字段为只读。

嗯,超级用户是系统的最高特权用户。 超级用户拥有对所有内容的绝对访问权是合乎逻辑的。

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

您可以为用户创建自定义模型管理员并添加 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',)