Django表单验证覆盖电子邮件

时间:2015-03-15 23:50:39

标签: django forms error-handling

我有以下表格:

class RemoveEmail(forms.ModelForm):
    email = forms.CharField(label=_("E-Mail"), max_length=150,
                             error_messages={
                                 'invalid': _("Required. This value may contain only letters, numbers and "
                                              "@_-.")})

    def __init__(self, *args, **kwargs):
        super(forms.ModelForm, self).__init__(*args, **kwargs)
        for f in self.fields:
            self.fields[f].widget.attrs['class'] = 'form-control'

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

    def delete(self, commit=False):
        try:
            email = self.cleaned_data.get('email')
            newsletter = Newsletter.objects.get(email=email)
            newsletter.optout = True
            if commit:
                newsletter.save()
            return True
        except Newsletter.DoesNotExist:
            return False

应该从简报列表中删除用户。用户通过电子邮件识别。

不幸的是,当用户提交表单时,它不会验证,而是抛出错误:

“包含此电子邮件的简报已经存在。”

无论如何都要覆盖这个?这似乎是我想要创建一个新对象的形式,而不是改变现有对象。

我的观点:

def optout(request):
    context = {}
    if request.POST:
        form = RemoveEmail(request.POST)
        if form.is_valid():
            status = form.delete(True)
            return render(request, 'index/sad.html')
    else:
        form = RemoveEmail()

    context.update({'form': form})
    return render(request, 'index/optout.html', context)

我的模特:

class Newsletter(models.Model):
    fullname = models.CharField(max_length=150, blank=True, null=True)
    email = models.CharField(max_length=150, unique=True)
    title = models.CharField(max_length=10, blank=True, null=True)
    optout = models.BooleanField(default=False)

    signup_date = models.DateTimeField(auto_now_add=True)
    useragent = models.CharField(max_length=255)
    ipaddress = models.CharField(max_length=32)
    country = models.CharField(max_length=100, blank=True, null=True)
    referrer = models.CharField(max_length=255, blank=True, null=True)

    def __unicode__(self):
        return self.email

1 个答案:

答案 0 :(得分:0)

您不应该使用ModelForm执行此任务。继承常规Form

class RemoveEmail(forms.Form):
    email = forms.EmailField(label=_("E-Mail"), max_length=150)
    ...