【问题标题】:Django form clean() method not raising errors when a ValidationError occurs发生 ValidationError 时,Django form clean() 方法不会引发错误
【发布时间】:2018-05-19 11:54:17
【问题描述】:

我正在尝试通过覆盖 clean() 方法为我的表单创建一个自定义验证器,但由于某种原因,验证错误没有正确引发。这是我的代码:

forms.py

from django import forms
from django.contrib.auth import get_user_model

class EmailForm(forms.Form):
    email_field = forms.EmailField(label='E-mail address', max_length=128)

    def clean(self):
         cleaned_data = super(EmailForm, self).clean()
         email = cleaned_data.get('email')

         try:
            u = get_user_model().objects.get(email=email)
            raise forms.ValidationError("E-mail already in database.")
            print('validation error raised')
        except:
            pass

views.py

from django.shortcuts import render
from django.contrib import messages

from .forms import EmailForm

def email_form(request):
    if request.method == 'POST':
        form = EmailForm(request.POST)

        # If the form is valid...
        if form.is_valid():
            messages.add_message(request, messages.SUCCESS, "Kaboom! Your referral e-mail was sent. Hang tight - we'll be sure to let you know when your friend makes a purchase.")
        else:
            messages.add_message(request, messages.ERROR, 'Error!')
   else:
       form = EmailForm()

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

template.html

<form action="{% url 'form-process' %}" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form>

当我提交带有应引发验证错误的输入(即,已与我的数据库中的用户关联的电子邮件地址)的表单时,我收到“成功”消息而不是错误消息。最奇怪的部分是在我的控制台中打印了“引发的验证错误”——但由于某种原因,表单进程和 form.is_valid() 传递为 True。

谁能告诉我为什么 form.is_valid 在输入重复的电子邮件时没有在下面的代码中输出错误?

【问题讨论】:

  • 你认为这个条款在做什么? except: Pass
  • 只有在电子邮件地址尚未与数据库中的用户关联时才应该触发该子句,对吧?如果我输入的电子邮件地址已经在数据库中,它应该留在“尝试”块中并引发验证错误。
  • try 块中引发的所有异常都被任何匹配异常的except 子句捕获,包括那些明确的raised。这就是try/except 的全部意义所在。
  • except: pass总是是个坏主意。

标签: django forms validation


【解决方案1】:

它不能引发异常,因为你的catch在except中。

def clean(self):
     cleaned_data = super(EmailForm, self).clean()
     email = cleaned_data.get('email')

     users = get_user_model().objects.filter(email=email)
     if users.exists():
         raise forms.ValidationError("E-mail already in database.")

【讨论】:

  • if users.exists(): 稍微好一点。
猜你喜欢
  • 1970-01-01
  • 2016-06-26
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多