Как добавить пользовательское поле на страницу входа в систему администратора Django

Для аутентификации необходимо 3 поля:

  • user_id
  • password
  • account_id

Каждый account_id определяет изолированное пространство, а user_id уникален только внутри своего соответствующего account_id.

Я создал пользовательскую аутентификацию бэкенда и могу успешно аутентифицироваться. Проблема в том, что форма логина Django Admin по умолчанию имеет поля user_id и password.

Я хотел бы добавить поле account_id в оригинальный шаблон формы Django, только подклассифицировав AuthenticationForm, возможно ли это?

enter image description here

Здесь есть похожий вопрос, но он использует пользовательский шаблон входа: Добавьте пользовательское поле в форму аутентификации Django Admin

Существующий код...

Модель:

class HeliosUser(AbstractUser, DateModelBase):
    username = None
    user_id = models.CharField(max_length=255)

    USERNAME_FIELD = "user_id"
    REQUIRED_FIELDS = ["account_id", "role", "email"]

    objects = HeliosUserManager()

    email = models.EmailField()
    account_id = models.ForeignKey(
        "agent.Agent",
        on_delete=models.RESTRICT,
    )
    ...

Бэкэнд:

class SettingsBackend(BaseBackend):
    def authenticate(
        self, request, user_id=None, account_id=None, password=None, **kwargs
    ):
        try:
            user = HeliosUser.objects.get(
                user_id=user_id, account_id=account_id
            )
        except HeliosUser.DoesNotExist:
            return None
        if user.check_password(password):
            return user
        return None

    def get_user(self, user_id, account_id):
        try:
            return HeliosUser.objects.get(
                user_id=user_id, account_id=account_id
            )
        except HeliosUser.DoesNotExist:
            return None

Админ сайта:

class HeliosUserAdmin(admin.AdminSite):
    site_title = "Helios Administration"
    site_header = "Helios Administration"
    index_title = "Helios Administration"
    login_form = HeliosAuthenticationForm


admin_site = HeliosUserAdmin()

Форма аутентификации:

class HeliosAuthenticationForm(AuthenticationForm):
    account_id = forms.ModelChoiceField(queryset=Agent.objects.all())

Заранее спасибо!

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