3

我添加了一个自定义后端,以允许用户使用用户名或电子邮件以及密码登录。它工作正常,除非电子邮件超过 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

我什至尝试过这里描述的 class_prepared 信号技术:

http://stackoverflow.com/questions/2610088/can-djangos-auth-user-username-be-varchar75-how-could-that-be-done/2613385#2613385

我不确定我在哪里出错了,我很感激你的帮助。

4

3 回答 3

4

如果您的目标是简单地更改表单的用户名字段的长度(而不是更改数据库中用户名字段的长度),那么正确的解决方案是将 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。

至于为什么您的代码不起作用,我的猜测是在将 AuthenticationForm 导入其他地方之前,您的应用程序的 urls.py 没有被加载。我不能发誓这是原因,但这是最有可能的。

于 2010-11-06T08:36:01.990 回答
0

最好的方法是将此代码添加到顶级初始化中:

# 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
}),
于 2012-10-30T18:28:57.980 回答
0

My guess: on urls.py use:

from django.contrib.auth.views import login

...

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

instead of the "lazy evaluation" form:

(r'^accounts/login/$', 'django.contrib.auth.views.login'),
于 2010-11-06T06:04:00.607 回答