forma semplice non convalidare
-
02-10-2019 - |
Domanda
ho trovato qui su StackOverflow un metodo per estendere Django built-in di autenticazione tramite segnali. La mia base di utenti è definito da 'e-mail' e le parole d'accesso (nome utente quindi non c'è). Così sto cercando di modificarlo per le mie esigenze, ma sto geting un errore di convalida per il mio modulo. cosa strana è che l'errore sia collegato al campo User.email e mi sto 'già in uso' anche se sto solo la registrazione al momento. Sta cercando di salvarlo 2 volte o che cosa? Ho scoperto che quando inviavo dizionario con i dati alla funzione di costruzione del modulo in guscio: form = MyForm(data={})
. Dopo questa forma era ancora valida, ma cambiando e-mail a valore diverso, infine, mi ha dato Vero.
La funzione user_created collegato al segnale di registrazione:
def user_created(sender, user, request, **kwargs):
form = CustomRegistrationForm(request.POST, request.FILES)
if form.is_valid():
data = UserProfile(user=user)
data.is_active = False
data.first_name = form.cleaned_data['first_name']
data.last_name = form.cleaned_data['last_name']
data.street = form.cleaned_data['street']
data.city = form.cleaned_data['city']
data.save()
else:
return render_to_response('user/data_operations/error.html', {'errors': form._errors}, context_instance=RequestContext(request))
user_registered.connect(user_created)
La mia forma:
class CustomRegistrationForm(RegistrationForm):
first_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
last_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
street = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
city = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
Il mio modello:
class UserProfile(models.Model):
first_name = models.CharField(_("Name"), max_length=50, blank=False,)
last_name = models.CharField(_("Last name"), max_length=50, blank=False,)
street = models.CharField(_("Street"), max_length=50, blank=False,)
city = models.CharField(_("City"), max_length=50, blank=False,)
user = models.ForeignKey(User, unique=True, related_name='profile',)
Modulo d'iscrizione: Classe registrationform (FORMATI.FORM):
email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,
maxlength=75)),
label=_("Adres email"))
password1 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
label=_("Haslo"))
password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
label=_("Haslo powtorzone"))
def clean_email(self):
email = self.cleaned_data.get("email")
if email and User.objects.filter(email=email).count() > 0:
raise forms.ValidationError(
_(u"Already in use."))
return email
Soluzione
il segnale 'user_registered' viene inviato dopo che l'utente viene salvato. Così ha già un campo 'email' definito.
Aggiorna
Utilizzando inquieta il pensiero:
form = CustomRegistrationForm(request.POST, request.FILES, notvalidateemail=True)
e in forma:
def __init__(self, *args, **kwargs):
self.notvalidateemail = kwargs.pop('notvalidateemail',False)
super(CustomRegistrationForm, self).__init__(*args, **kwargs)
def clean_email(self):
if self.notvalidateemail:
return
else:
#your cleaning here
return email
Altri suggerimenti
Problema:
Il modulo viene prima salvato da django-registrazione. Poi si salva di nuovo in user_created.
Soluzioni:
-
Utilizza una forma diversa in user_created. Uno campi che non sono già salvati (questi da User modello come e-mail). Hai voglia di salvare i dati aggiuntivi in ??user_created, giusto?
-
Aggiungi alcuni parametri per la forma come:
in user_created:
form = CustomRegistrationForm(dontvalidateemail=True, request.POST, request.FILES)
e di forma di init ;
self.dontvalidateemail = dontvalidateemail
poi basta controllare in clean_email.