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?

32
demandé sur Community 2011-06-16 01:29:14

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

32
répondu Matt 2011-06-17 01:21:33

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.

5
répondu chirale 2013-03-04 09:17:10

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.

5
répondu Iqbal 2014-10-25 07:16:08