如何使用电子邮件代替用户名进行身份验证,使用 django-registration。
进一步说,一旦我已经安装了注册模块,如何强制执行此更改。
我需要在库文件夹中编辑这里的解决方案吗?Anyone knows a good hack to make django-registration use emails as usernames?
如何使用电子邮件代替用户名进行身份验证,使用 django-registration。
进一步说,一旦我已经安装了注册模块,如何强制执行此更改。
我需要在库文件夹中编辑这里的解决方案吗?Anyone knows a good hack to make django-registration use emails as usernames?
亲爱的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
将URL重定向到您想要使用的路径。
project/urls.py
(r'^accounts/', include('registration.backends.default.urls')),
告诉你的URL使用自定义后端进行注册视图。此外,导入你创建的表单并将其添加到要由视图处理的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'
),
)
希望那个能起作用!
-Matt
如果您使用的是Django >= 1.3且< 1.5版本,则可以在Github上找到名为“Django email as username”的项目。
最近我正在使用注册功能,我很容易地切换到“django-registration-email”。 它可以在Django 1.4上正常工作,重用相同的模板,并简单地添加REGISTRATION_EMAIL_ACTIVATE_SUCCESS_URL = "/profiles/create/"
以重定向至个人资料创建页面。
Django 1.5通过自定义用户模型解决了这个问题,其中您可以指定用作用户名的字段。正如Django 1.5文档中所述:
描述User模型上用作唯一标识符的字段名称的字符串。通常这将是某种类型的用户名,但也可以是电子邮件地址或任何其他唯一标识符。
<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_email和id_username是由Django注册表单自动设置的id值。
ALTER TABLE auth_user ALTER COLUMN username TYPE varchar(75);
。 - Casey