2016-04-05 4 views
0

Это выглядит как основная проблема, которую я не смог решить. У меня есть простая HTML-страница с текстовым полем и кнопкой отправки. Текстовое поле должно принимать электронную почту ids от пользователей и хранить его в БД при нажатии кнопки отправки. Помимо обычной проверки формата электронной почты, мне также нужно проверить, существует ли в базе данных письмо, а затем информировать пользователя. Мой код выглядит следующим образом:проверка формы в django для проверки уникальных писем

models.py

from __future__ import unicode_literals 
from django.db import models 


class NotificationEmail(models.Model): 
    email = models.EmailField(max_length=200) 
    created = models.DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return u'%s' % self.email 

forms.py

from django import forms 
from home.models import NotificationEmail 

class NotifyForm(forms.ModelForm): 
    class Meta: 
     model = NotificationEmail 
     fields = ['email'] 

    def check_duplicate_email(self): 
     data = self.cleaned_data['email'] 
     if NotificationEmail.objects.filter(email=data).exists(): 
      raise forms.ValidationError('Your email is already in our list of users to be notified.Try a new email') 

views.py

from django.shortcuts import render 
from forms import NotifyForm 

def notify(request): 
    if request.method == 'POST': 
     form = NotifyForm(request.POST) 
     if form.is_valid(): 
      form.save() 
    else: 
     form = NotifyForm() 

    return render(request, 'index.html', {'form': form}) 

index.html

<form class="form-horizontal" method="POST" action =""> 
 
    {% csrf_token %} 
 
    <button type="submit">Notify Me</button> 
 
    {{form.email}} 
 
</form>

Это сохраняет сообщения электронной почты в БД при нажатии на button.However представить, он никогда не проверяет существующую электронную почту ids и моя БД имеет много дубликатов идентификаторов. Что я делаю неправильно?

+0

Rename определение функции check_duplicate_email (самостоятельно): 'в' Защиту clean_email (самостоятельно): '. Проверьте [docs] (https://docs.djangoproject.com/en/1.9/ref/forms/validation/#cleaning-a-specific-field-attribute). – JRodDynamite

+0

сделал это и теперь ничего не сохраняет для БД .. – Amistad

ответ

1

from.is_valid() не вызывать ваша функция check_duplicate_email().
Вы можете написать пользовательскую проверку, как это:

def clean_email(self): data = self.cleaned_data['email'] if User.objects.filter(email=data).count() > 0: raise forms.ValidationError("We have a user with this user email-id") return data

Для еще одного примера Custom form validation

1

Вы можете использовать unique=True flag в области электронной почты:

email = models.EmailField(max_length=200, unique=True)

+0

будет распространяться как ошибка в форме проверки шаблонов? – Amistad

+0

да это будет - просто убедитесь, что вы визуализировали теги ошибок в шаблоне – dpdenton

+0

У вас получилось работать? – dpdenton

 Смежные вопросы

  • Нет связанных вопросов^_^