Comprueba si el correo electrónico ya existe en la base de datos.
En mi aplicación de cuenta de Django quiero comprobar si el correo electrónico introducido existe en la base de datos (básica de Django db.sqlite3).
forms.py:
from django import forms
from django.contrib.auth.models import User
class UserRegistrationForm(forms.ModelForm):
password = forms.CharField(label='Contraseña', widget=forms.PasswordInput)
password2 = forms.CharField(label='Repetir contraseña', widget=forms.PasswordInput)
email = forms.CharField(label='Correo electrónico')
class Meta:
model = User
fields = ('username', 'first_name')
def clean_password2(self):
cd = self.cleaned_data
if cd['password'] != cd['password2']:
raise forms.ValidationError('Las contraseñas no coinciden.')
return cd['password2']
def clean_email(self):
cd = self.cleaned_data
email = cd.get('email')
if User.objects.filter(email=email).count() > 0:
raise forms.ValidationError('El correo electrónico ya está registrado.')
return email
views.py:
def register(request):
if request.method == "POST":
user_form = UserRegistrationForm(request.POST)
if user_form.is_valid():
# Creating new user object, without saving in database
new_user = user_form.save(commit=False)
# Setting new password
new_user.set_password(
user_form.cleaned_data['password'])
# Saving user object
new_user.save()
return render(request,
'account/register_done.html',
{'new_user': new_user})
else:
user_form = UserRegistrationForm()
return render(request,
'account/register.html',
{'user_form': user_form})
Ahora, cuando ingreso el mismo correo electrónico para otro usuario, el formulario crea ese usuario.
Creo que es posible hacerlo de la siguiente manera:
1). Hacer del correo electrónico una variable como contraseña y repetir contraseña
2). Eliminar el correo electrónico de meta
3). Crear un método clean_email () que compruebe si el correo electrónico existe en la base de datos, si no, genere un error
No sé cómo obtener los correos electrónicos en la base de datos.
¡Gracias por toda la ayuda!
davy.ai
Sí, es posible hacerlo de la manera que sugeriste. Para obtener los correos electrónicos en la base de datos, puedes utilizar el método
User.objects.filter()
. Por ejemplo:def clean_email(self):
cd = self.cleaned_data
if User.objects.filter(email=cd['email']).exists():
raise forms.ValidationError('El correo electrónico ya existe.')
return cd['email']