Question

Comment utiliser les e-mails au lieu du nom d'utilisateur pour l'authentification à l'aide de django-registration .

En outre, comment appliquer ce changement une fois que j'ai déjà installé le module d'inscription.

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

Était-ce utile?

La solution

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 .

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 () dans django-registration.

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 URL vers les chemins que vous souhaitez utiliser.

< project/urls.py

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

Dites à vos URL d'utiliser le backend personnalisé pour la vue d'inscription.De plus, importez le formulaire que vous avez créé et ajoutez-le à l'URL à traiter par la vue.

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 marche!

-Mat

Autres conseils

Pour Django>= 1.3 et <1.5, il y a l'adresse e-mail Django 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 résout ce problème grâce au modèle 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 sur le modèle User 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 e-mail ou de tout autre identifiant unique.

Le moyen le plus simple serait de masquer le champ username dans le modèle registration_form avec la propriété CSS display: none . Et ajoutez un script qui prend la valeur du champ de formulaire email et définit la valeur dans le champ nom d'utilisateur caché. Ainsi, lors de la soumission du formulaire, l'utilisateur soumet l'e-mail en tant que 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 e-mail de plus de 30 caractères. Par conséquent, vous devriez 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 srcipt jQuery simple qui définit la valeur dans le champ de formulaire masqué username est:

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

Les identifiants id_email et id_username sont définis automatiquement par le formulaire d'inscription django.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top