usuarios - Django-Registro: correo electrónico como nombre de usuario
path login django (3)
Estimado compañero Django Coder,
Creo que esta es la mejor manera de hacerlo. ¡Buena suerte!
El primer paso es crear la forma que te gustaría usar .
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'']
Aquí está creando un archivo para anular la función register () en django-registration.
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
Dirige tus URL a las rutas que quieras usar.
proyecto / urls.py
(r''^accounts/'', include(''registration.backends.default.urls'')),
Indique a sus URL que utilicen el servidor personalizado para la vista de registro. Además, importe el formulario que creó y agréguelo a la url para que la vista lo procese.
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 eso funcione!
-Mate
¿Cómo uso los correos electrónicos en lugar del nombre de usuario para la autenticación usando django-registration ?
Además, ¿cómo hago cumplir este cambio una vez que ya he 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?
La forma más sencilla sería ocultar el campo de nombre de usuario en la plantilla registration_form con CSS display: none property. Y añada una secuencia de comandos que toma el valor del campo de formulario de correo electrónico y establece el valor en el campo de nombre de usuario oculto. Por lo tanto, 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, de forma predeterminada, no puede aceptar un correo electrónico de más de 30 caracteres. Por lo tanto, para una apuesta segura, debe aumentar la longitud del nombre de usuario manualmente en su base de datos.
Aquí está la nueva plantilla 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>
El srcipt jQuery simple que establece el valor en el nombre de usuario del campo de formulario oculto es:
$(document).ready(function()
{
$(''#id_email'').blur(function(e)
{
var email_address = $(''#id_email'').val();
$(''#id_username'').val(email_address);
});
});
Los ids id_email y id_username se establecen automáticamente mediante el formulario django-registration.
Para Django> = 1.3 y <1.5, hay un correo electrónico de Django como nombre de usuario en github.
Recientemente estoy usando el registro y cambio fácilmente a django-registration-email . Funciona bien en Django 1.4, reutilizando las mismas plantillas y simplemente agregando REGISTRATION_EMAIL_ACTIVATE_SUCCESS_URL = "/profiles/create/"
para redirigir a la página de creación de profile .
Django 1.5 soluciona este problema a través del modelo de Usuario personalizado, donde puede especificar qué campo se utiliza como nombre de usuario . Como se indica en la documentación de Django 1.5:
Una cadena que describe el nombre del campo en el modelo de usuario que se utiliza como el identificador único. Por lo general, este 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.