2010-11-06 20 views
2

我添加了一个自定义后端,允许用户使用用户名或电子邮件以及密码登录。除非电子邮件超过30个字符,否则它工作正常。形式的错误,我得到的是:使用电子邮件和密码登录到django站点时,出现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 

我不知道我在哪里出错,我很感谢帮助。

+0

是否已进行了肯定,在数据库的用户名场可容纳字符串长度超过30长:但是,如果你选择我们@Gabriel赫利回答上面,你可以将它通过使用下面的代码传递到登录表单字符?在您运行syncdb并创建表之前,'class_prepare'信号只会有所帮助。 Syncdb从不改变现有表格。 – OmerGertel 2010-11-06 06:09:11

回答

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在你的模板,视图等

至于为什么你的代码不能正常工作,我的猜测是你的应用程序的urls.py不会在AuthenticationForm被导入到其他地方之前被加载。我不能以此为由宣称这是其中的原因,但最可能的原因是

+0

这很好!而子类可以传递给登录视图,所以我都设置好了。谢谢。 – asciitaxi 2010-11-06 10:08:58

+0

你们是否在使用django注册?如果是这样,你把上面的代码放在哪里?现在登录表单正在通过它自动生成,所以我不确定在哪里用这个替换它 – Brenden 2011-08-08 23:34:05

0

我的猜测:在urls.py使用:

from django.contrib.auth.views import login 

... 

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

,而不是“懒惰评估”形式:

(r'^accounts/login/$', 'django.contrib.auth.views.login'), 
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 

(r'^accounts/login/$', 'django.contrib.auth.views.login', { 
    'authentication_form': AuthenticationForm 
}), 
相关问题