Ошибка ограничения 30 символов при входе на сайт django с адресом электронной почты и паролем - PullRequest
2 голосов
/ 06 ноября 2010

Я добавил пользовательский бэкэнд, позволяющий пользователю войти в систему с именем пользователя или электронной почтой в дополнение к паролю.Он отлично работает, за исключением случаев, когда электронное письмо длиннее 30 символов.Ошибка формы, которую я получаю:

"Ensure this value has at most 30 characters (it has 35)."

В одном файле urls.py моих приложений я переопределил max_length поля имени пользователя, например:

from django.contrib.auth.forms import AuthenticationForm
AuthenticationForm.base_fields['username'].max_length = 75

I 'мы даже попробовали описанную здесь технику сигналов class_prepared:

/1498359/mozhet-li-imya-dhango-authuser-username-byt-varchar-75-kak-eto-moglo-byt-sdelano#1498364

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

Ответы [ 3 ]

4 голосов
/ 06 ноября 2010

Если ваша цель состоит в том, чтобы просто изменить длину поля имени пользователя для формы (а не изменить длину поля имени пользователя в базе данных), тогда правильное решение - это создать подкласс AuthenticationForm следующим образом:

from django import forms
from django.contrib.auth.forms import AuthenticationForm

class MyAuthenticationForm(AuthenticationForm):
    username = forms.CharField(label="Username", max_length=75)

На самом деле, строка документации для AuthenticationForm даже говорит: «Базовый класс для аутентификации пользователей. Расширьте это, чтобы получить форму, которая принимает логин имени пользователя / пароля».

Используйте вашу новую форму вместо старойAuthenticationForm в ваших шаблонах, представлениях и т. Д.

Что касается того, почему ваш код не работает, я предполагаю, что urls.py вашего приложения не загружается до того, как AuthenticationForm будет импортирован в другое место.Я не мог поклясться в этом, но это наиболее вероятно.

0 голосов
/ 30 октября 2012

Лучше всего этот код добавляется в init верхнего уровня:

# Added so the login field can take email addresses longer than 30 characters
from django.contrib.auth.forms import AuthenticationForm

AuthenticationForm.base_fields['username'].max_length = 75
AuthenticationForm.base_fields['username'].widget.attrs['maxlength'] = 75
AuthenticationForm.base_fields['username'].validators[0].limit_value = 75

Однако, если вы решите нам @Gabriel Hurley ответ выше, вы можете передать его в форму входа, используя следующий код:

(r'^accounts/login/$', 'django.contrib.auth.views.login', {
    'authentication_form': AuthenticationForm
}),
0 голосов
/ 06 ноября 2010

Мое предположение: при использовании urls.py:

from django.contrib.auth.views import login

...

    (r'^accounts/login/$', login),

вместо формы "ленивая оценка":

(r'^accounts/login/$', 'django.contrib.auth.views.login'),
...