Как сделать валидацию по email?

Подскажите пожалуйста в чем ошибка.. Мне нужно сделать валидацию по email. Чтобы при вводе email который уже есть в базе данных он выдавал ошибку. Если же все нормально и такого email нету, то он сохранял запись. Вот что имеем..

forms.py

from django import forms
from django.db import models
from .models import Reviews
from django.core.exceptions import ValidationError


        #Форма отзывов
class ReviewForm(forms.Form):
    text = forms.CharField(max_length=5000)
    name = forms.CharField(max_length=100)
    email = forms.EmailField()


    text.widget.attrs.update({'class':'form-control'})
    name.widget.attrs.update({'class':'form-control'})
    email.widget.attrs.update({'class':'form-control'})


    def clean_email(self):
        new_email = self.cleaned_data['email']

        if new_email == self.cleaned_data['email']:
            raise ValidationError('You cannot reuse the same email')
        return new_email



    def save(self):
        new_review = Reviews.objects.create(
        text=self.cleaned_data['text'],
        name=self.cleaned_data['name'],
        email=self.cleaned_data['email']
        )
        return new_review

views.py

from django.shortcuts import render, redirect
from django.views.generic import ListView, DeleteView
from django.views.generic.base import View
from .models import *
from .forms import ReviewForm

        #Форма отзывов
class Add_Review(View):
    def get(self, request):
        form = ReviewForm()
        return render(request, 'reviews.html', context={'form':form})

        #Проверка на валидность
    def post(self, request):
        bound_form = ReviewForm(request.POST)

        if bound_form.is_valid():
            new_review = bound_form.save()
            return redirect('detail_review_url')
        return render(request, 'reviews.html', context={'form':bound_form})


def review_detail(request):
    review = Reviews.objects.all()
    return render(request, 'see_reviews.html', context={'review':review})

models.py

from django.db import models

        #Отзывы
class Reviews(models.Model): 
    email = models.EmailField()
    name = models.CharField("Имя", max_length=100, db_index=True)
    text = models.TextField("Сообщение", max_length=5000)
    date_pub = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        return self.name

Ответы (1 шт):

Автор решения: 5c0rp

В вашем варианте

def clean_email(self):
        new_email = self.cleaned_data['email']

        if new_email == self.cleaned_data['email']:
            raise ValidationError('You cannot reuse the same email')
        return new_email

вы зачем то присваиваете переменной new_email значение с self.cleaned_data['email'], а потом опять же сравниваете его с self.cleaned_data['email']. Как вариант попробуйте заменить эту функцию на

def clean_email(self):
        new_email = self.cleaned_data['email']
        if Reviews.objects.filter(email=new_email).exists():
            raise ValidationError('You cannot reuse the same email')
        return new_email

Reviews.objects.filter(email=new_email).exists() вернет True если Reviews с таким email уже существует и False если нет.

→ Ссылка