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_emailid_username 由 django 注册表自动设置。

【讨论】:

以上是关于Django-Registration:电子邮件作为用户名的主要内容,如果未能解决你的问题,请参考以下文章

Django 实现网站注册用户邮箱验证功能

django-registration 视图自定义

get_sucess_url 如何在 django 中工作?

包含 django-registration 的 url

django-registration 与 paypal 集成

django-registration 和 CSS 文件