Как сделать валидацию по 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 если нет.