32 votes

Django-Registration : Email comme nom d'utilisateur

Comment utiliser les emails au lieu du nom d'utilisateur pour l'authentification avec django-registration .

En outre, comment puis-je appliquer ce changement une fois que j'ai déjà installé le module d'enregistrement ?

Dois-je modifier la solution ici Quelqu'un connaît-il un bon hack pour que django-registration utilise les emails comme noms d'utilisateur ? dans le dossier lib ?

33voto

Matt Points 473

Cher collègue codeur Django,

Je pense que c'est la meilleure façon de procéder. Bonne chance !

La première étape consiste à créer le formulaire que vous souhaitez utiliser. .

projet/comptes/formulaires.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 remplacer la fonction register() de django-registration.

projet/comptes/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 souhaitez utiliser.

projet/urls.py

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

Dites à vos urls d'utiliser le backend personnalisé pour la vue d'enregistrement. Importez également le formulaire que vous avez créé et ajoutez-le à l'url qui sera traitée par la vue.

projet/comptes/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'
    ),

) 

J'espère que ça marchera !

-Matt

5voto

chirale Points 651

Pour Django >= 1.3 et < 1.5 il y a Django email comme nom d'utilisateur sur github.

Récemment, j'utilise l'enregistrement et je passe facilement à django-registration-email . Cela fonctionne bien sur Django 1.4, en réutilisant les mêmes modèles et en ajoutant simplement REGISTRATION_EMAIL_ACTIVATE_SUCCESS_URL = "/profiles/create/" pour rediriger vers le profil page de création.

Django 1.5 a résolu ce problème grâce à un modèle d'utilisateur personnalisé où vous pouvez spécifier quel champ est utilisé comme nom d'utilisateur . Comme indiqué dans la documentation de Django 1.5 :

Une chaîne décrivant le nom du champ du modèle de l'utilisateur qui est utilisé comme identifiant unique. Il s'agit généralement d'un nom d'utilisateur, mais il peut également s'agir d'une adresse électronique ou de tout autre identifiant unique.

5voto

iqbal Points 19

Le moyen le plus simple serait de masquer l'élément nom d'utilisateur dans le champ formulaire d'inscription modèle avec CSS display:none propriété. Et ajoutez un script qui prend la valeur de la propriété e-mail et définit la valeur dans le champ caché du formulaire nom d'utilisateur champ. Ainsi, en soumettant le formulaire, l'utilisateur soumet l'email comme nom d'utilisateur sans le savoir. Le seul problème est qu'un champ de nom d'utilisateur, par défaut, ne peut pas accepter un email de plus de 30 caractères. Par conséquent, pour plus de sécurité, vous devez augmenter manuellement la longueur du nom d'utilisateur dans votre base de données.

Voici le nouveau modèle 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>

Le simple srcipt jQuery qui définit la valeur dans le champ de formulaire caché 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 y id_username sont définis automatiquement par le formulaire django-registration.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X