【问题标题】:Prevent Superuser from deleting/removing/editing User Email in Django Admin防止超级用户在 Django Admin 中删除/删除/编辑用户电子邮件
【发布时间】:2017-12-06 07:46:03
【问题描述】:

我正在使用 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 中编辑/删除“电子邮件”。我不想要这样的行为。 (但尝试删除用户名会出现“必填字段”错误。)

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

【问题讨论】:

  • 您有User 的自定义模型管理员吗?

标签: python django django-allauth


【解决方案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',)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2012-09-10
      • 2018-01-18
      • 1970-01-01
      相关资源
      最近更新 更多