Условное требование пароля при создании пользователя на странице Django Admin
Я использую LDAP для аутентификации в моем Django приложении, поэтому при добавлении пользователя на странице администратора мне не нужно задавать пароль, так как пользователь будет аутентифицирован на бэкенде LDAP. Я хотел бы изменить страницу 'Add user' в представлениях администратора, чтобы иметь булев селектор для определения, когда я пытаюсь добавить пользователя LDAP, чтобы поле пароля не требовалось. Я хотел бы сохранить возможность ввода пароля на случай, если мне понадобится добавить локального пользователя, который аутентифицируется на бэкенде Django.
Вот что я собрал на данный момент:
models.py
Модифицирован метод сохранения таким образом, что пользователь заполняется в модели CustomUser, если isLdap
равен True
.
class CustomUser(AbstractUser):
pass
isLdap = models.BooleanField(default=False)
def save(self, *args, **kwargs):
if self.isLdap:
user = LDAPBackend().populate_user(self.username)
else:
super().save(*args, **kwargs)
def __str__(self):
return self.username
admin.py
Я успешно добавил флажок, чтобы определить, является ли новый пользователь пользователем LDAP, но значение не сохраняется в модели CustomUser
, и мне нужно изменить save_model
так, чтобы он сохранял фактический пароль, если он действителен, иначе set_unusable_password()
.
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
add_fieldsets = (
(None, {
'description': (
"Enable 'IsLdap' if the username is a LAN ID. "
),
'fields': ('username','isLdap'),
}),
('Password', {
'fields': ('password1', 'password2'),
}),
)
model = CustomUser
def save_model(self, request, obj, form, change):
obj.set_unusable_password()
super(UserAdmin, self).save_model(request, obj, form, change)
admin.site.register(CustomUser, CustomUserAdmin)
forms.py
Не уверен, что это то место или как это сделать, но я думаю, что здесь мне нужно условно установить ....required = False
, если isLdap
является True
.
class CustomUserCreationForm(UserCreationForm):
def __init__(self, *args, **kwargs):
super(UserCreationForm, self).__init__(*args, **kwargs)
self.fields['password1'].required = False
self.fields['password2'].required = False
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError("Passwords don't match")
return password2
Благодарю за любую помощь в получении функциональности этого кода!
Вот что я в итоге сделал:
Models.py
from django.db import models
from django.contrib.auth.models import (AbstractUser, BaseUserManager, )
from django_auth_ldap.backend import LDAPBackend
from django.dispatch import receiver
# Create your models here.
class CustomUserManager(BaseUserManager):
def create_user(self, username, is_ldap, password, **extra_fields):
if not username:
raise ValueError(_('The username must be set'))
user = self.model(username=username,
is_ldap=is_ldap,
**extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, username, is_ldap, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(username, is_ldap, password, **extra_fields)
class CustomUser(AbstractUser):
is_ldap = models.BooleanField(default=False)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['is_ldap']
objects = CustomUserManager()
def __str__(self):
return self.username
@receiver(models.signals.post_save, sender=CustomUser)
def user_created(sender, instance, created, **kwargs):
if created and instance.is_ldap:
user = LDAPBackend().populate_user(instance.username)