Django的is_valid方法

这是一个 Django 表单体系的核心函数。

下面我给你做一个系统、实战向的讲解,让你彻底理解 is_valid() 的本质、流程和典型用法。


🧩 一、is_valid() 是什么?

在 Django 中,is_valid()表单(Form 或 ModelForm) 的一个方法,用来:

验证表单中提交的数据是否符合要求,并把清洗过的数据放入 form.cleaned_data 中。

📘 适用于:

  • forms.Form
  • forms.ModelForm
  • 任何自定义的表单类


🧠 二、使用方式

form = UserForm(request.POST)
if form.is_valid():
    # 表单验证通过
    print(form.cleaned_data)
else:
    # 验证失败
    print(form.errors)


⚙️ 三、is_valid() 内部做了什么?

当你调用 form.is_valid() 时,Django 其实执行了以下几步 👇

① 调用 form.full_clean()

这个函数是核心逻辑,它会依次执行:

  1. 字段验证(Field.clean())
  2. 模型验证(Model.clean_fields()、Model.validate_unique())
  3. 表单清洗(clean)(执行 clean_<field>() 和 clean())

② 设置两个重要属性:

  • form.cleaned_data 👉 保存所有验证通过并清洗后的字段值(Python 格式的数据)。
  • form.errors 👉 保存所有验证失败的错误信息。


🔍 四、验证流程图

is_valid()
   ↓
full_clean()
   ↓
 ┌──────────────────────────────┐
 │ 1. 字段验证 (Field.clean)    │
 │   - 类型、必填、正则验证等     │
 └──────────────────────────────┘
   ↓
 ┌──────────────────────────────┐
 │ 2. 字段清洗 (clean_<field>)  │
 │   - 例如 clean_username()     │
 └──────────────────────────────┘
   ↓
 ┌──────────────────────────────┐
 │ 3. 表单整体清洗 (clean)      │
 │   - 跨字段验证逻辑            │
 └──────────────────────────────┘
   ↓
 ┌──────────────────────────────┐
 │ 4. 模型唯一性验证 (ModelForm)│
 │   - unique / unique_together │
 └──────────────────────────────┘
   ↓
生成 cleaned_data / errors


🧰 五、常见用法示例

✅ 1. 基础验证(内置验证)

from django import forms

class UserForm(forms.Form):
    username = forms.CharField(max_length=10)
    age = forms.IntegerField(min_value=18)
form = UserForm({'username': 'TongQing', 'age': 17})
form.is_valid()  # False
print(form.errors)
# {'age': ['Ensure this value is greater than or equal to 18.']}


✅ 2. 自定义字段验证(clean_<field>

class UserForm(forms.Form):
    username = forms.CharField(max_length=10)

    def clean_username(self):
        data = self.cleaned_data['username']
        if ' ' in data:
            raise forms.ValidationError("Username cannot contain spaces")
        return data


✅ 3. 表单整体验证(clean()

class RegisterForm(forms.Form):
    password = forms.CharField()
    confirm_password = forms.CharField()

    def clean(self):
        cleaned_data = super().clean()
        pwd = cleaned_data.get('password')
        confirm = cleaned_data.get('confirm_password')

        if pwd != confirm:
            raise forms.ValidationError("Passwords do not match")
        return cleaned_data


✅ 4. 模型验证(ModelForm

from django.contrib.auth.models import User
from django import forms

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['username', 'email']

如果模型中定义了 unique=True 字段(如 username),

重复提交相同用户名时,form.is_valid() 会返回 False,并自动生成错误信息:

{'username': ['A user with that username already exists.']}


🧩 六、验证通过后的数据(cleaned_data

验证成功后,所有合法的数据会出现在 cleaned_data 中:

if form.is_valid():
    print(form.cleaned_data)
    # {'username': 'tongqing', 'age': 18}


🚨 七、验证失败时(form.errors

如果表单中有错误,form.errors 会保存所有错误信息,格式是一个字典:

if not form.is_valid():
    print(form.errors.as_json())
    # {"username": [{"message": "This field is required.", "code": "required"}]}


📋 八、总结对比表

内容说明
作用验证并清洗表单输入数据
返回值True(验证通过)或 False(验证失败)
关键属性cleaned_data(成功数据) / errors(错误信息)
主要验证阶段字段验证 → 字段清洗 → 表单清洗 → 模型唯一性验证
常见失败原因字段缺失、格式错误、唯一性冲突、自定义验证失败


🧠 九、一句话总结

form.is_valid() 是 Django 表单验证的核心入口, 它不仅校验字段合法性,还会执行自定义逻辑、模型约束等, 成功后生成 cleaned_data,失败则生成详细的 errors 信息。


文章标签:

评论(0)