【问题标题】:Unable to raise Validation Error from ModelForm on the browser (DJANGO)无法从浏览器上的 ModelForm 引发验证错误 (DJANGO)
【发布时间】:2019-08-15 06:33:45
【问题描述】:

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

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

型号:

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>

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

任何帮助将不胜感激。

【问题讨论】:

    标签: django forms django-forms modelform validationerror


    【解决方案1】:

    你快到了!只需按照以下 sn-p

    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')
            if Foo.objects.filter(email=email).exists():
                return email
            else:
                raise forms.ValidationError('This email is already in use.')


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

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

    【讨论】:

      【解决方案2】:

      你有一个简单的缩进问题。您的 return redirect... 行始终在 POST 上调用,即使表单无效。将其再移动一个缩进,使其位于is_valid 块内。

      【讨论】:

        猜你喜欢
        • 2023-03-12
        • 2020-10-14
        • 2011-11-10
        • 1970-01-01
        • 2017-04-26
        • 2016-01-26
        • 2012-09-30
        • 2011-04-21
        • 2016-10-15
        相关资源
        最近更新 更多