Невозможно войти в систему администратора 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
Вероятно, это потребует изменения дополнительных проверок.