无法从浏览器上的 ModelForm 引发验证错误 (DJANGO)

Unable to raise Validation Error from ModelForm on the browser (DJANGO)

如果用户输入数据库中已有的电子邮件,我会尝试引发错误并在浏览器上显示错误。由于某些原因,数据库中没有保存任何内容,而不是引发错误,而是将用户重定向到我设置为重定向到的页面。

如果数据库中存在电子邮件,我希望能够停止用户并引发错误。

型号:

class Foo(models.Model):
    full_name = models.CharField(max_length=50)
    email = models.EmailField(max_length=50, blank=False)
    phone_number = models.CharField(max_length=10, blank=False)

表格。

from django import forms

from .models import Foo

class FooModelForm(ModelForm):
    class Meta:
        model = Foo
        fields = ['full_name', 
                'email',
                'phone_number']
        help_texts = {'full_name': ('Required'),
                    'email': ('Required'),
                    'phone_number': ('Required')}

    def clean_email(self):
        '''
        Check if exists in database.
        '''
        email = self.cleaned_data.get('email')
        try:
            match = Foo.objects.get(email=email)
        except Foo.DoesNotExist:
            return email

        # raise forms.ValidationError('This email is already in use.')

from django.shortcuts import render, redirect
from snippets.models import Foo
from snippets.forms import FooModelForm



def index(request):
    if request.method == 'POST':
        form = FooModelForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('snippets:form-sent')

    else:
        form = FooModelForm()

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

HTML

<form method="post" id="form">
    {% csrf_token %}
    {{ form|crispy }}
    <div class="text-center">
       <button type="submit" class="btn btn-primary">Submit</button>
    </div>
</form>

我完全迷失在这里,尽管它可能很简单。

如有任何帮助,我们将不胜感激。

你快到了!!只需按照下面的代码片段

from django import forms
from .models import Foo


class FooModelForm(ModelForm):
    class Meta:
        model = Foo
        fields = ['full_name',
                  'email',
                  'phone_number']
        help_texts = {'full_name': ('Required'),
                      'email': ('Required'),
                      'phone_number': ('Required')}

    <b>def clean_email(self):
        '''
        Check if exists in database.
        '''
        email = self.cleaned_data.get('email')
        if Foo.objects.filter(email=email).exists():
            return email
        else:
            raise forms.ValidationError('This email is already in use.')</b>


为什么我要使用 exists() 方法而不是 try...except?

它比 try..except 更快更高效。
参考 : What is more efficient .objects.filter().exists() or get() wrapped on a try

您有一个简单的缩进问题。您的 return redirect... 行总是在 POST 上被调用,即使表单无效。将其进一步缩进,使其位于 is_valid 块内。