Регистрация Django: электронная почта как имя пользователя - PullRequest
32 голосов
/ 16 июня 2011

Как использовать электронную почту вместо имени пользователя для аутентификации с использованием django-registration .

Далее, как применить это изменение после того, как я уже установил модуль регистрации.

Могу ли я отредактировать решение здесь Кто-нибудь знает хороший взлом, чтобы django-регистрация использовала электронные письма в качестве имен пользователей? в папке lib?

Ответы [ 3 ]

32 голосов
/ 17 июня 2011

Дорогой парень, Джанго Кодер,

Я думаю, что это лучший способ сделать это. Удачи!

Первый шаг - создать форму, которую вы хотите использовать .

проект / счета / 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']

Здесь вы создаете файл для переопределения функции register () в django-registration.

Проект / счета / 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-адреса на пути, которые вы хотите использовать.

Проект / urls.py

(r'^accounts/', include('registration.backends.default.urls')),

Сообщите своим URL-адресам использовать пользовательский бэкэнд для просмотра регистрации. Кроме того, импортируйте созданную вами форму и добавьте ее в 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'
    ),

) 

Надеюсь, что это работает!

Матф

5 голосов
/ 25 октября 2014

Самый простой способ - скрыть поле username в шаблоне registration_form с помощью CSS display: none . И добавьте скрипт, который берет значение из поля формы 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 srcipt, который устанавливает значение в скрытом поле формы. username :

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

Идентификаторы id_email и id_username устанавливаются формой регистрации django автоматически.

5 голосов
/ 20 октября 2012

Для Django> = 1,3 и <1,5 есть <a href="https://github.com/dabapps/django-email-as-username" rel="nofollow"> электронная почта Django в качестве имени пользователя на github.

В последнее время я использую регистрацию и легко переключаюсь на django-registration-email.Он отлично работает на Django 1.4, повторно используя те же шаблоны и просто добавляя REGISTRATION_EMAIL_ACTIVATE_SUCCESS_URL = "/profiles/create/" для перенаправления на страницу создания профиля .

Django 1.5 преодолевает эту проблему с помощью пользовательской модели пользователя, где Вы можете указать, какое поле используется в качестве имени пользователя .Как указано в документации Django 1.5:

Строка, описывающая имя поля в модели User, которое используется в качестве уникального идентификатора.Обычно это будет какое-то имя пользователя, но это также может быть адрес электронной почты или любой другой уникальный идентификатор.

...