Невозможно войти в систему администратора django

почему, когда is_staff = false и is_superuser = true, я все еще не могу войти в панель администратора django.

Могу ли я сделать что-то специальное, чтобы is_superuser мог войти в систему, даже если is_staff равен false? Кто-нибудь может мне помочь?

Потому что администратор требует is_staff это True, действительно, в документации Django [Django-doc] мы читаем:

Если вам нужно создать пользователя для входа в систему, используйте команду createsuperuser. По умолчанию для входа в систему администратора требуется, чтобы у пользователя был установлен атрибут is_staff в значение True.

Это проверяется в AdminAuthenticationForm с помощью [GitHub]:

def confirm_login_allowed(self, user):
    super().confirm_login_allowed(user)
    if not user.is_staff:
        raise ValidationError(
            self.error_messages["invalid_login"],
            code="invalid_login",
            params={"username": self.username_field.verbose_name},
        )

Таким образом, он проверяет, есть ли user.is_staff:

Могу ли я сделать что-то специальное, чтобы is_superuser мог войти в систему, даже если is_staff будет false?

Обычно также не имеет особого смысла is_superuser=True и is_staff=False, поскольку суперпользователь обычно на один уровень "выше", чем персонал.

Вы можете сделать настраиваемую форму, а затем зарегистрировать ее на сайте администратора:

from django.contrib import admin
from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _


class CustomAuthenticationForm(AuthenticationForm):
    error_messages = {
        **AuthenticationForm.error_messages,
        'invalid_login': _(
            'Please enter the correct %(username)s and password for a staff '
            'account. Note that both fields may be case-sensitive.'
        ),
    }
    required_css_class = 'required'

    def confirm_login_allowed(self, user):
        super().confirm_login_allowed(user)
        if not user.is_superuser:
            raise ValidationError(
                self.error_messages['invalid_login'],
                code='invalid_login',
                params={'username': self.username_field.verbose_name},
            )


def has_permission(self, request):
    return request.user.is_active and request.user.is_superuser


admin.site.login_form = CustomAuthenticationForm
admin.site.has_permission = has_permission

Вероятно, это потребует изменения дополнительных проверок.

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