Django-Registration:用户名发送电子邮件

Eva*_*611 32 django django-registration

如何使用django-registration使用电子邮件而不是用户名进行身份验证.

进一步说明如何在安装注册模块后强制执行此更改.

我在这里编辑解决方案任何人都知道一个好的黑客,使django注册使用电子邮件作为用户名吗?在lib文件夹中?

Mat*_*att 32

亲爱的Django Coder,

我认为这是最好的方法.祝好运!

第一步,是创建您想要使用的表单.

项目/帐号/ 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']
Run Code Online (Sandbox Code Playgroud)

在这里,您要创建一个文件来覆盖django-registration中的register()函数.

项目/帐号/ 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
Run Code Online (Sandbox Code Playgroud)

将您的网址指向您要使用的路径.

项目/ urls.py

(r'^accounts/', include('registration.backends.default.urls')),
Run Code Online (Sandbox Code Playgroud)

告诉您的网址使用自定义后端作为注册视图.此外,导入您创建的表单并将其添加到要由视图处理的URL.

项目/帐号/ 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'
    ),

) 
Run Code Online (Sandbox Code Playgroud)

希望有效!

-Matt

  • 我尝试过了,它的工作,但是我结束了使用https://bitbucket.org/hakanw/django-email-usernames/wiki/Home感谢你洙多你的投入!希望我将来会使用它,其他人也可以使用它! (6认同)
  • 默认情况下,用户名字段的长度限制为30个字符; 如果您尝试将电子邮件地址用作用户名,则可能会导致一些问题.除上述步骤外,更改用户名列以接受更长的字符串.例如,在Postgres中,查询将是`ALTER TABLE auth_user ALTER COLUMN username TYPE varchar(75);` (5认同)

chi*_*ale 5

对于Django> = 1.3和<1.5,Django电子邮件作为 github上的用户名.

最近我正在使用注册,我很容易切换到django-registration-email.它在Django 1.4上工作正常,重用相同的模板,只需添加REGISTRATION_EMAIL_ACTIVATE_SUCCESS_URL = "/profiles/create/"重定向到配置文件创建页面.

Django 1.5通过自定义用户模型克服了这个问题,您可以在其中指定用作用户名的字段.如Django 1.5文档中所述:

描述用户模型上用作唯一标识符的字段名称的字符串.这通常是某种用户名,但也可以是电子邮件地址或任何其他唯一标识符.


Iqb*_*bal 5

最简单的方法是使用CSS display:none属性隐藏registration_form模板中的用户名字段.并添加一个脚本,该脚本从电子邮件表单字段中获取值,并在隐藏的用户名字段中设置值.因此,在提交表单时,用户会在不知情的情况下将电子邮件作为用户名提交.唯一的问题是,因为默认情况下,用户名字段不能接受超过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>
Run Code Online (Sandbox Code Playgroud)

在隐藏表单字段用户名中设置值的Simple jQuery srcipt 是:

$(document).ready(function()
{
  $('#id_email').blur(function(e)
  {
    var email_address = $('#id_email').val();
    $('#id_username').val(email_address);
   });
});
Run Code Online (Sandbox Code Playgroud)

ids id_emailid_username由django-registration表单自动设置.