Django-Registration:电子邮件作为用户名
Posted
技术标签:
【中文标题】Django-Registration:电子邮件作为用户名【英文标题】:Django-Registration: Email as username 【发布时间】:2011-09-15 21:59:45 【问题描述】:如何使用电子邮件而不是用户名使用django-registration 进行身份验证。
进一步说明,一旦我安装了注册模块,我该如何执行此更改。
我是否在 lib 文件夹中的 Anyone knows a good hack to make django-registration use emails as usernames? 处编辑解决方案?
【问题讨论】:
【参考方案1】:亲爱的 Django 程序员,
我认为这是最好的方法。祝你好运!
第一步,是创建您想要使用的表单。
project/accounts/forms.py
from django import forms
from registration.forms import RegistrationForm
from django.contrib.auth.models import User
class Email(forms.EmailField):
def clean(self, value):
super(Email, self).clean(value)
try:
User.objects.get(email=value)
raise forms.ValidationError("This email is already registered. Use the 'forgot password' link on the login page")
except User.DoesNotExist:
return value
class UserRegistrationForm(forms.Form):
password1 = forms.CharField(widget=forms.PasswordInput(), label="Password")
password2 = forms.CharField(widget=forms.PasswordInput(), label="Repeat your password")
#email will be become username
email = Email()
def clean_password(self):
if self.data['password1'] != self.data['password2']:
raise forms.ValidationError('Passwords are not the same')
return self.data['password1']
这里你正在创建一个文件来覆盖 django-registration 中的 register() 函数。
project/accounts/regbackend.py
from django.conf import settings
from django.contrib.sites.models import RequestSite
from django.contrib.sites.models import Site
from registration import signals
from registration.forms import RegistrationForm
from registration.models import RegistrationProfile
from registration.backends import default
class Backend(default.DefaultBackend):
def register(self, request, **kwargs):
email, password = kwargs['email'], kwargs['password1']
username = email
if Site._meta.installed:
site = Site.objects.get_current()
else:
site = RequestSite(request)
new_user = RegistrationProfile.objects.create_inactive_user(username, email,
password, site)
signals.user_registered.send(sender=self.__class__,
user=new_user,
request=request)
return new_user
将您的网址指向您要使用的路径。
project/urls.py
(r'^accounts/', include('registration.backends.default.urls')),
告诉您的网址使用自定义后端进行注册视图。此外,导入您创建的表单并将其添加到要由视图处理的 url。
project/accounts/urls.py
from django.conf.urls.defaults import *
from registration.backends.default.urls import *
from accounts.forms import UserRegistrationForm
urlpatterns += patterns('',
#customize user registration form
url(r'^register/$', 'registration.views.register',
'backend': 'accounts.regbackend.Backend',
'form_class' : UserRegistrationForm
,
name='registration_register'
),
)
希望有效!
-马特
【讨论】:
我试过了,但我最终使用了bitbucket.org/hakanw/django-email-usernames/wiki/Home,非常感谢您的意见!希望我将来会使用它,其他人也可以使用它! @Eva611 - 很高兴你能弄明白。 默认情况下,用户名字段限制为 30 个字符;如果您尝试使用电子邮件地址作为用户名,这可能会导致一些问题。除了上述步骤之外,更改用户名列以接受更长的字符串。例如,在 Postgres 中,查询将是ALTER TABLE auth_user ALTER COLUMN username TYPE varchar(75);
我认为应该是 clean_password2 而不是 UserRegistrationForm 中的 clean_password 和 clean_data 而不是 data。
FWIW 现代 django 的用户名最大长度现在默认为 150 最大。 docs.djangoproject.com/en/1.11/ref/contrib/auth/#user-model【参考方案2】:
对于 Django >= 1.3 和 Django email as username。
最近我正在使用注册,我很容易切换到django-registration-email。它在 Django 1.4 上运行良好,重复使用相同的模板,只需添加 REGISTRATION_EMAIL_ACTIVATE_SUCCESS_URL = "/profiles/create/"
即可重定向到 profile 创建页面。
Django 1.5 通过you can specify what field is used as username 的自定义用户模型克服了这个问题。如 Django 1.5 文档中所述:
描述用户模型上用作唯一标识符的字段名称的字符串。这通常是某种用户名,但也可以是电子邮件地址或任何其他唯一标识符。
【讨论】:
【参考方案3】:最简单的方法是使用 CSS display:none 属性隐藏 registration_form 模板中的 username 字段。并添加一个脚本,该脚本从 email 表单字段中获取值并在隐藏的 username 字段中设置该值。因此,在提交表单时,用户在不知情的情况下将电子邮件作为用户名提交。唯一的问题是,默认情况下,用户名字段不能接受超过 30 个字符的电子邮件。因此,为了安全起见,您应该在数据库中手动增加用户名长度。
这是新的 registration_form.html 模板:
<form method="post" action="" class="wide">
% csrf_token %
<dl>
<div style="display:none">
<dt>
<label for="id_username">Username:</label>
% if form.username.errors %
<span class="error"> form.username.errors.as_text </span>
% endif %
</dt>
<dd> form.username </dd>
</div>
<dt>
<label for="id_email">Email address:</label>
% if form.email.errors %
<span class="error"> form.email.errors.as_text </span>
% endif %
</dt>
<dd> form.email </dd>
<br>
<dt>
<label for="id_password1">Password:</label>
% if form.password1.errors %
<span class="error"> form.password1.errors.as_text </span>
% endif %
</dt>
<dd> form.password1 </dd>
<br>
<dt>
<label for="id_password2">Password (type again to catch typos):</label>
% if form.password2.errors %
<span class="error"> form.password2.errors.as_text </span>
% endif %
</dt>
<dd> form.password2 </dd>
<br>
<dt><input type="submit" value="Sign up" /></dt>
</dl>
</form>
在隐藏表单字段用户名中设置值的简单jQuery脚本是:
$(document).ready(function()
$('#id_email').blur(function(e)
var email_address = $('#id_email').val();
$('#id_username').val(email_address);
);
);
id id_email 和 id_username 由 django 注册表自动设置。
【讨论】:
以上是关于Django-Registration:电子邮件作为用户名的主要内容,如果未能解决你的问题,请参考以下文章
get_sucess_url 如何在 django 中工作?