mingmei123 发表于 2023-9-18 20:48:13

raise ValidationError与self.add_error与form.error

请大神讲解一下,什么情况用哪种报错方式,有什么区别?最好带一些使用场景

isdkz 发表于 2023-9-18 20:48:26

在Django中,我们可以使用三种方式来报告表单验证错误:

1.raise ValidationError : 通过抛出 ValidationError 异常来报告表单验证错误。这种方式适用于在表单中进行自定义验证逻辑时,如果验证失败,我们可以通过抛出异常来报告错误。

例如,我们可以在表单的clean方法中添加自定义验证逻辑:

from django import forms
from django.core.exceptions import ValidationError

class ContactForm(forms.Form):
    name = forms.CharField()
    email = forms.EmailField()

    def clean(self):
      cleaned_data = super().clean()
      name = cleaned_data.get('name')
      email = cleaned_data.get('email')
      if name and email:
            if 'example.com' in email:
                raise ValidationError("Email addresses from example.com are not allowed.")


2.self.add_error : 这种方式适用于在表单字段级别上进行验证。如果我们需要在特定字段上报告错误,我们可以使用self.add_error方法来添加错误信息。

例如,我们可以在表单字段的clean方法中添加验证逻辑:

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField()
    email = forms.EmailField()

    def clean_email(self):
      email = self.cleaned_data.get('email')
      if email and 'example.com' in email:
            self.add_error('email', "Email addresses from example.com are not allowed.")
      return email


3.form.errors : 这种方式适用于在视图函数中直接报告表单验证错误。如果我们需要在视图函数中手动验证表单,并直接报告错误,我们可以使用form.errors属性来添加错误信息。

例如,我们可以在视图函数中手动验证表单:

from django.shortcuts import render
from .forms import ContactForm

def contact(request):
    if request.method == 'POST':
      form = ContactForm(request.POST)
      if form.is_valid():
            # 处理表单数据
            pass
      else:
            # 手动报告表单验证错误
            form.errors['email'] = ["Email addresses from example.com are not allowed."]
    else:
      form = ContactForm()
    return render(request, 'contact.html', {'form': form})


总的来说, raise ValidationError适用于在表单级别上进行自定义验证逻辑; self.add_error适用于在字段级别上进行验证,并添加错误信息; form.errors适用于在视图函数中手动处理表单验证错误。

isdkz 发表于 2023-9-18 22:40:23

raise ValidationError是在表单验证过程中,当某个字段的值不满足特定条件时,手动抛出一个ValidationError异常。这种方式通常用于自定义验证逻辑,可以根据具体的条件判断来抛出异常,比如判断密码强度不够或者用户名已存在等。

self.add_error是在表单验证过程中,当某个字段的值不满足特定条件时,将错误信息添加到该字段的错误列表中。这种方式通常用于内置的字段验证,比如使用内置的required验证器来验证字段是否为空,如果为空则调用self.add_error方法来添加错误信息。

form.error是在模板中用于显示表单错误信息的变量。当表单验证不通过时,错误信息会被添加到该变量中,然后在模板中通过form.error来显示错误信息。

使用场景举例:
· 如果需要自定义验证逻辑,比如判断密码强度不够,可以使用raise ValidationError来手动抛出异常。
· 如果使用内置的验证器,比如required验证器,可以使用self.add_error来添加错误信息。
· 在模板中,可以通过form.error来显示表单验证的错误信息。
页: [1]
查看完整版本: raise ValidationError与self.add_error与form.error