Django-Registration: e-mail come nome utente
-
28-10-2019 - |
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?
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.