Django的is_valid方法
已于 2025年10月30日 19:43 修改
访问次数:0
这是一个 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()
这个函数是核心逻辑,它会依次执行:
- 字段验证(Field.clean())
- 模型验证(Model.clean_fields()、Model.validate_unique())
- 表单清洗(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)