Условное требование пароля при создании пользователя на странице 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)

admin.py

Вернуться на верх