Я пытаюсь сделать поле логина администратора более 30 символов, потому что я использую пользовательский бэкэнд для аутентификации электронной почты, который не заботится о длине поля имени пользователя.
Я хотел настроить приложение monkey_patch
, которое применило бы изменения ко всем сайтам администратора.
from django.contrib.auth.forms import AuthenticationForm
AuthenticationForm.base_fields['username'].max_length = 150 # or whatever
Это не работает, и я не понимаю, почему нет.
Печатные выписки в ...
django.contrib.admin.forms.AdminAuthenticationForm
django.contrib.auth.views.login
django.contrib.auth.views.login.form
# экземплярная форма
... показывает правильный, измененный номер при отображении страницы входа через /myadmin/anywhere/
.
Даже экземпляр формы в окончательной функции рендеринга показывает правильное число.
# django.contrib.auth.views.login
...
print form.fields['username'].max_length # this is an instantiated form!
return render_to_response(template_name, context ...)
Чего мне не хватает?
Где поле волшебным образом решает, что его длина 30 символов? Я не вижу, где он может измениться между моим оператором печати и render_to_response
.
Если я передаю административный сайт подклассу AuthenticationForm
, он работает.
class LongerAuthenticationForm(AuthenticationForm):
username = forms.CharField(max_length=150)
class MyAdmin(AdminSite):
login_form = LongerAuthenticationForm
Это все меня смущает, потому что я вижу, что экземпляр формы, переданный в конечную функцию рендеринга, имеет правильный CharField
с max_length=150
.