Django-inscription: Email comme nom d'utilisateur
comment utiliser les e-mails au lieu du nom d'utilisateur pour l'authentification en utilisant django-registration .
Comment appliquer ce changement une fois que j'ai installé le module d'enregistrement.
puis-je modifier la solution ici quelqu'un connait un bon hack pour faire de django-inscription utiliser les e-mails que les noms d'utilisateur? dans le dossier lib?
3 réponses
Chers Django Codeur,
je pense que c'est la meilleure façon de le faire. Bonne chance!
la première étape consiste à créer le formulaire que vous souhaitez utiliser .
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']
ici vous créez un fichier pour outrepasser la fonction register() dans 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
dirigez vos urls vers les chemins que vous voulez utiliser.
project/urls.py
(r'^accounts/', include('registration.backends.default.urls')),
dites à vos urls d'utiliser le backend personnalisé pour la vue d'enregistrement. Aussi, importez le formulaire que vous avez créé et ajoutez-le à l'url à traiter par la vue.
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'
),
)
Espère que fonctionne!
Mat
Pour Django >= 1.3 et < 1.5 il y a Django e-mail comme nom d'utilisateur sur github.
récemment j'utilise l'enregistrement et je passe facilement à django-enregistrement-email . Il fonctionne très bien sur Django 1.4, en réutilisant les mêmes gabarits et en ajoutant simplement REGISTRATION_EMAIL_ACTIVATE_SUCCESS_URL = "/profiles/create/"
pour rediriger vers la page de création profil .
Django 1.5 surmonter ce problème grâce à un modèle d'utilisateur personnalisé où , vous pouvez spécifier ce champ est utilisé comme nom d'utilisateur . Comme indiqué dans la Documentation de Django 1.5:
chaîne de caractères décrivant le nom du champ sur le modèle utilisateur qui est utilisé comme Identificateur unique. Il s'agit habituellement d'un nom d'utilisateur, mais il peut aussi s'agir d'une adresse courriel ou de tout autre identificateur unique.
la manière la plus simple serait de cacher le nom d'utilisateur dans le champ registration_form template avec CSS display:none . Et Ajouter un script qui prend la valeur du champ de formulaire email et définit la valeur dans le champ caché nom d'utilisateur . Ainsi, lors de la soumission du formulaire, l'utilisateur soumet le courriel comme nom d'utilisateur sans le savoir. Le seul problème est que depuis un champ Nom d'utilisateur, par défaut, ne peut pas accepter un courriel qui est plus de 30 caractères. Alors, pour sûr, vous devez augmenter la longueur du nom d'utilisateur manuellement dans votre base de données.
Voici la nouvelle registration_form.modèle 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>
le simple jQuery srcipt qui fixe la valeur dans le champ de la forme cachée nom d'utilisateur est:
$(document).ready(function()
{
$('#id_email').blur(function(e)
{
var email_address = $('#id_email').val();
$('#id_username').val(email_address);
});
});
les ids id_email et id_username sont définis automatiquement par le formulaire d'enregistrement django.