Как проверить, есть электронная почта уже в базе данных или нет в django?

#python #django #sqlite #django-models #django-forms

#python #django #sqlite #django-модели #django-forms

Вопрос:

Я хочу добавить функциональность в регистрационную форму, чтобы, если электронная почта уже есть в базе данных, чем отображать массаж, т.Е. Это электронное письмо уже зарегистрировано. я пытаюсь это сделать со следующим кодом, но это не работает

accounts/forms.py

 from django.contrib.auth import get_user_model
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm


class UserCreateForm(UserCreationForm):

    # email = forms.EmailField()
    class Meta:
        fields = ["username","email","password1","password2"]
        model = get_user_model()
        
    def clean_email(self):
            email = self.cleaned_data.get('email')
            if email in User.objects.all():
                raise forms.ValidationError("This email is already register")
            return email
    def __init__(self,*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['username'].label = 'Display Name'
        # self.fields['email'].label = 'Email Address'
  

Ответ №1:

в вашем UserCreateForm.clean_email вы не проверяете это правильным образом. Вы проверяете этим if email in User.objects.all() . Здесь email это не User объект. User.objects.all() возвращает queryset набор User объектов. Поскольку, email не является экземпляром User , проверка вашего состояния не прошла успешно. Вместо этого выполните следующие действия, чтобы проверить, существует ли уже пользователь с предоставленным электронным письмом

 def clean_email(self):
    email = self.cleaned_data.get('email')
    if email.split('.')[-1] !=  'edu' :
        raise forms.ValidationError("Only .edu email addresses allowed")
    if User.objects.filter(email__iexact=email).exists():
        raise forms.ValidationError("User with that email already exists")
    return email

  

Убедитесь, что вы установили email в своей User модели значение быть unique .

Ответ №2:

Вы неправильно выполняете проверку, она должна быть такой,

 class UserCreateForm(UserCreationForm):
    # rest of your code

    def clean_email(self):
        email = self.cleaned_data["email"]
        if User.objects.filter(email__iexact=email).exists():
            raise forms.ValidationError("Only .edu email addresses allowed")
        return email