Форма входа администратора Django - переопределение max_length невозможно - PullRequest
3 голосов
/ 31 мая 2011

Я пытаюсь сделать поле логина администратора более 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.

Ответы [ 3 ]

8 голосов
/ 31 мая 2011

Похоже, мне нужно напрямую изменить атрибуты виджета.

Я забыл, что поля создаются один раз!
CharField(max_length=30) уже устанавливает атрибуты виджета для HTML.Независимо от того, как я изменил max_length для экземпляра поля, виджет уже создан.

Вот мое решение в моем приложении monkey_patch.

from django.contrib.auth.forms import AuthenticationForm

AuthenticationForm.base_fields['username'].max_length = 150 # I guess not needed
AuthenticationForm.base_fields['username'].widget.attrs['maxlength'] = 150 # html
AuthenticationForm.base_fields['username'].validators[0].limit_value = 150

Я не оченьпонять, почему создание экземпляра нового поля не работает ..?

AuthenticationForm.base_fields['username'] = forms.CharField(max_length=100) 
3 голосов
/ 28 марта 2012

В django 1.3 вы можете создать приложение со следующим кодом и убедиться, что вы включили его в настройках.Это решение очень похоже на принятое, но оно происходит от AdminAuthenticationForm, в противном случае ваши неполевые ошибки не будут отображаться.

from django.contrib.admin.forms import AdminAuthenticationForm
from django import forms
from django.contrib.admin.sites import AdminSite

class LongerAuthenticationForm(AdminAuthenticationForm):
    """ Subclass which extends the max length of the username field. """
    username = forms.CharField(max_length=150)


AdminSite.login_form = LongerAuthenticationForm
1 голос
/ 19 июня 2012

из django.contrib.admin.forms import AdminAuthenticationForm

class ModifiedForm(AdminAuthenticationForm):
    username = forms.CharField(max_length=150) #and so on

в urls.py

from django.contrib import admin
admin.site.login_form = ModifiedForm

...

admin.autodiscover()
...