当前位置: 首页 > news >正文

完整教程:Django中的clean()方法和full_clean()方法

前言

clean()是Django在处理数据验证时的常用方法
本博客适合那些知道clean_<filename>方法但是不知道clean()方法的学习者
full_clean()方法用于测试clean()方法的第二种用法,算是补充

clean()

此方法有两种用法,一种用于表单验证,另一种用于模型验证

1、表单验证

在表单验证中,clean()方法用于执行表单最后的验证
他们的执行顺序是这样的
在这里插入图片描述
clean()方法是"最后一道防线"
下面来说一下用法

def clean_<filename>(self):""" 其他的验证 """return data# 与其他验证同级编写def clean(self):clean_data = super().clean()"""这里执行具体的操作"""return clean_data

此处super().clean()得到的是一个已经经过校验的字典

因为clean()方法在最后执行,所以此时得到的是已经经过了前面校验的数据

那么有人可能就会问了,此时已经经过了所有的clean_<filename>方法,那么此时的cleaned_data字典与此时的super().clean()是不是一样的,答案是一样的,他们虽然调用的方式不同,但是他们所指的内存地址是一样的


已知我们在clean_<filename>中抛出raise ValidationError("错误信息")错误信息时
可以在前端中通过ModelForm对象.字段名.errors.0来渲染错误信息
像这样:

<span style="color: red;">{{ form.password.errors.0 }}</span>

类似的当clean()方法中抛出raise ValidationError("错误信息")时可以
通过.non_field_errors获取错误信息
然后
在前端中这样渲染错误信息:

<span style="color: red;">{{ form.non_field_errors.0 }}</span>

2、模型验证

在定义模型的时候如果我们想在这个阶段进行数据的验证,那就需要使用到clean()方法的第二种用法

from datetime import date
from django.core.exceptions import ValidationError
class User(models.Model):
name = models.CharField(verbose_name="姓名",max_length=128)
age = models.IntegerField(verbose_name="年龄")
birthday = models.DateField(verbose_name="生日")
# --------- 验证区域 -------------
def clean(self):
super().clean()
if self.birthday > date.today():
raise ValidationError("生日不能大于今天")

注意在这里也要调用super().clean()这样才可以
否则字段里面的验证就不会生效(max_length=128这些字段级验证就会失效)
注意用self.字段名获取字段值

此时抛出的验证错误等同于在ModelForm里面
通过raise ValidationError("")抛出的验证错误
都可以通过.non_field_errors在前端中获取


举个例子:

def clean(self):
raise ValidationError("测试错误")

此时他创建的ModelForm在前端中可以通过

<span style="color: red;">{{ form.confirm_password.errors.0 }}</span>

来获取错误


总结一下就是在模型中的clean()方法抛出的错误的获取方式就
等同于在ModelForm中的clean()方法抛出的错误
都可以通过.non_field_errors获取

full_clean()

已知通过.save()会执行你在模型里面定义的验证规则以及在ModelForm中定义的验证规则
full_clean()方法则会只执行你在models.py中定义的相关验证

举个例子就明白了
models.py

class User(models.Model):
name = models.CharField(verbose_name="姓名",max_length=128)
age = models.IntegerField(verbose_name="年龄")
birthday = models.DateField(verbose_name="生日")
def clean(self):
super().clean()
if self.birthday > date.today():
raise ValidationError("生日不能大于今天")

编写一个测试用例

admin_test = User(name="张三",age=21,birthday='2027-1-1')
try:
admin_test.full_clean()
admin_test.save()
except ValidationError as e:
for field, errors in e.message_dict.items():
print(f"{field}: {errors}")

此时控制台打印

__all__: ['生日不能大于今天']

注意:full_clean()如果通过了就什么都不会返回
但是如果没有通过验证他就会抛出raise ValidationError

.save()方法可以用于ModelForm对象保存数据到数据库
也可以用于模型对象保存数据到数据库

user = models.User.objects.create(
username='john',
email='john@example.com',
password='password123'
)
# 等价于
user_object = User(
username='john',
email='john@example.com',
password='password123'
)
user_object.save()

但是不会进行clean()验证,只会执行字段级别的验证,比如max_length=128这种验证

http://www.jsqmd.com/news/287926/

相关文章:

  • 一键启动FSMN-VAD,开箱即用的语音检测工具
  • 输出文件在哪?/root/cv_fft_inpainting_lama目录结构说明
  • AI绘画2025趋势实战:Z-Image-Turbo开源模型+Gradio快速上线指南
  • 黄金一直上涨,猜测跟霉国债务挂钩
  • 2024年AI开发者入门必看:Llama3-8B开源模型部署全流程
  • Qwen3-Embedding-4B省算力方案:动态维度输出实战案例
  • 如何为不同需求选装修公司?2026年上海装修公司全面评测与推荐,直击增项与工艺痛点
  • rc5.d目录作用揭秘,搭配测试脚本更好懂
  • 微信联系作者,技术支持就在身边
  • 新消费品牌如何布局AI搜索?2026年GEO优化推荐与评价,直击场景化营销痛点
  • AB实验的关键认知(六)分流单元与分析单元
  • AB实验的关键认知(五)综合评估标准 OEC
  • 2026年热门的垂直式压缩垃圾站/压缩垃圾站设备行业热度TOP榜
  • Llama3-8B科研辅助应用:论文润色系统部署实战教程
  • 2026年GEO公司招商加盟推荐:基于多场景实测评价,解决信息过载与信任构建痛点
  • YOLOv9推理只需一条命令,官方镜像真香
  • AutoGLM-Phone支持哪些设备?Android 7.0+适配部署指南
  • unet person image cartoon compound常见问题避坑指南:转换失败解决方案
  • 2026年AI搜索优化服务市场深度解析:五大服务商甄选策略与实效案例洞察
  • Qwen3-Embedding-4B分布式部署:多GPU负载均衡实践
  • Z-Image-Turbo提示词不生效?argparse参数绑定避坑部署教程
  • IQuest-Coder-V1成本优化方案:小团队也能用的40B模型部署法
  • Qwen3-Embedding-0.6B部署进阶:自定义指令增强特定任务效果
  • 基于提示词的精准控制:Qwen儿童图像生成参数调整指南
  • Qwen为何移除Pipeline?简化依赖带来的稳定性提升
  • DeepSeek-R1-Distill-Qwen-1.5B GPU适配:CUDA 12.8环境配置教程
  • Qwen3-4B科研辅助应用:论文润色系统部署案例
  • 2026年三大领域资产管理系统推荐:房地产、产业园、物业
  • 2026年AI搜索营销推荐:五大服务商横向评测,解决信息过载与匹配痛点
  • 2026年知名的复合耐磨陶瓷衬板/复合陶瓷衬板厂家最新热销排行