Django: переопределить admin/login с пользовательским loginview и authenticationform, но с тем же шаблоном
Я добавил поле срока действия к моему User. Теперь я хочу добавить пользовательское сообщение об ошибке при неудачном входе в систему, если срок действия учетной записи истек, потому что если я переопределю только метод ModelBackend'а can_authenticate, форма выдаст стандартную ошибку валидации, которая предполагает, что проблема кроется в учетных данных. Я предпочитаю ясность.
Поэтому я расширил AuthenticationForm и переписал его метод confirm_login_allowed, чтобы сделать проверку срока действия и вызвать ValidationError с новым добавленным сообщением об ошибке.
Однако, я получаю жалобы от Django, что шаблон не существует:
TemplateDoesNotExist в /admin/login/
registration/login.html
urls.py
from django.contrib.auth import views as auth_views
from my_app.auth.forms import AuthForm
urlpatterns = [
# path("admin/", admin.site.urls), # Have to comment out or the next item will not match
re_path(r"^admin/login/$", auth_views.LoginView.as_view(form_class=AuthForm), name="login"),
re_path(r"^logout/$", auth_views.LogoutView, name="logout"),
...
]
my_app/auth/forms.py
from django.contrib.auth.forms import AuthenticationForm
from django.core.exceptions import ValidationError
class AuthForm(AuthenticationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.error_messages["account_expired"] = "This account has expired."
def confirm_login_allowed(self, user):
super().confirm_login_allowed(user)
if user.expired:
raise ValidationError(self.error_messages["account_expired"], code="inactive")