Domanda

Come posso usare le e -mail anziché il nome utente per l'autenticazione utilizzando Django-Registration.

Inoltre, come faccio ad applicare questa modifica una volta che ho già installato il modulo di registrazione.

Modificherò la soluzione qui Qualcuno conosce un buon hack per far sì che Django-Registration usi le e-mail come nomi utente? Nella cartella Lib?

È stato utile?

Soluzione

Caro collega programmatore Django,

Penso che questo sia il modo migliore per farlo. Buona fortuna!

Primo passo è creare il modulo che desideri usare.

Progetto/Account/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']

Qui stai creando un file per sovrascrivere la funzione Register () in Django-Registration.

Progetto/Account/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

Dirigi i tuoi URL ai percorsi che desideri utilizzare.

Progetto/Urlspy

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

Di 'ai tuoi URL di utilizzare il backend personalizzato per la vista di registrazione. Inoltre, importa il modulo creato e aggiungilo all'URL per essere elaborato dalla vista.

Progetto/Account/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'
    ),

) 

Spero che funzioni!

-Opaco

Altri suggerimenti

Per django> = 1.3 e <1.5 c'è Django Email come nome utente su github.

Di recente sto usando la registrazione e passo facilmente a Django-Registration-Email. Funziona bene su Django 1.4, riutilizzando gli stessi modelli e semplicemente aggiungendo REGISTRATION_EMAIL_ACTIVATE_SUCCESS_URL = "/profiles/create/" per reindirizzare al profilo pagina di creazione.

Django 1.5 supera questo problema attraverso il modello utente personalizzato dove È possibile specificare quale campo viene utilizzato come nome utente. Come indicato nella documentazione di Django 1.5:

Una stringa che descrive il nome del campo sul modello utente utilizzato come identificatore univoco. Questo di solito sarà un nome utente di qualche tipo, ma può anche essere un indirizzo e -mail o qualsiasi altro identificatore univoco.

Il modo più semplice sarebbe nascondere il nome utente campo nel Modulo di registrazione Modello con CSS Display: nessuno proprietà. E aggiungere uno script che prende il valore da e-mail modulo campo e imposta il valore nel nascosto nome utente campo. Quindi, durante l'invio del modulo, l'utente presenta l'e -mail come nome utente senza saperlo. L'unico problema è poiché un campo nome utente, per impostazione predefinita, non può accettare un'e -mail che è più lunga di 30 caratteri. Quindi, per una scommessa sicura, dovresti aumentare manualmente la lunghezza del nome utente nel tuo database.

Ecco il nuovo modello 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>

Il semplice srcipt jQuery che imposta il valore nel campo del modulo nascosto nome utente è:

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

Gli ID id_email e id_username sono impostati automaticamente dal modulo Django-Registration.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top