Pregunta

¿Cómo uso los correos electrónicos en lugar del nombre de usuario para la autenticación utilizando registro de django.

Además, ¿cómo hago cumplir este cambio una vez que ya haya instalado el módulo de registro?

¿Edito la solución aquí? ¿Alguien sabe un buen truco para hacer que Django-Registration use los correos electrónicos como nombres de usuario? ¿En la carpeta LIB?

¿Fue útil?

Solución

Estimado compañero codificador Django,

Creo que esta es la mejor manera de hacerlo. ¡Buena suerte!

El primer paso es crear el formulario que le gustaría usar.

proyecto/cuentas/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']

Aquí está creando un archivo para anular la función Registro () en el registro Django.

Proyecto/Cuentas/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

Dirija sus URL a las rutas que desea usar.

proyecto/urls.py

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

Dígale a sus URL que usen el backend personalizado para la vista de registro. Además, importe el formulario que creó y agréguelo a la URL que se procesará por la vista.

proyecto/cuentas/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'
    ),

) 

¡Espero que funcione!

-Mate

Otros consejos

Para django> = 1.3 y <1.5 hay Correo electrónico de Django como nombre de usuario en Github.

Recientemente estoy usando el registro y cambio fácilmente a django-registro-envío. Funciona bien en Django 1.4, reutilizando las mismas plantillas y simplemente agregando REGISTRATION_EMAIL_ACTIVATE_SUCCESS_URL = "/profiles/create/" para redirigir al perfil Página de creación.

Django 1.5 supere este problema a través del modelo de usuario personalizado donde Puede especificar qué campo se usa como nombre de usuario. Como se indica en Django 1.5 Documentación:

Una cadena que describe el nombre del campo en el modelo de usuario que se utiliza como identificador único. Esto generalmente será un nombre de usuario de algún tipo, pero también puede ser una dirección de correo electrónico o cualquier otro identificador único.

La forma más simple sería ocultar el nombre de usuario campo en el formulario de inscripción plantilla con CSS Pantalla: ninguno propiedad. Y agregue un script que tome el valor del Email Campo de formulario y establece el valor en el oculto nombre de usuario campo. Entonces, al enviar el formulario, el usuario envía el correo electrónico como nombre de usuario sin saberlo. El único problema es que un campo de nombre de usuario, por defecto, no puede aceptar un correo electrónico que tenga más de 30 caracteres. Entonces, para una apuesta segura, debe aumentar la longitud del nombre de usuario manualmente en su base de datos.

Aquí está la nueva plantilla de registro_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>

El simple jQuery srcipt que establece el valor en el campo de formulario oculto nombre de usuario es:

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

Las identificaciones Id_email y ID_USERNAME están establecidos por el formulario de registro de Django automáticamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top