前言

在实际开发中,不仅仅是对输入框字符的格式校验,比如注册功能,注册账号还得校验数据库是否已经有账号被注册过了。
有些场景不仅仅是对单个输入框的字符校验,比如修改密码的时候,会涉及2个输入框的数据格式校验,像这些复杂的场景校验需用到校验钩子来实现。
校验form表单数据合法性,is_valid()方法调用顺序:

  • 1.字段规则校验,字符长度,是否必填等基本校验
  • 2.validators校验(RegexValidator校验器或自定义校验函数)
  • 3.局部钩子(类中定义的以clean_字段名命名的函数,校验正常必须返回该字段的值self.cleaned_data.get(‘name’))
  • 4.全局钩子(类中定义的函数名clean,校验正常必须返回该对象的校验结果值return self.cleaned_data)
  • 5.每一步通过校验单结果都以字典形式保存在类对象的cleaned_data属性中

ModelForm模型表单

局部钩子命名规则为clean_字段名称,如:clean_city,clean_years。
super() 重写__init__,可以批量更新class属性。

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/class SubmitPageForm(forms.ModelForm):class Meta:model = Submit# fields = "__all__"  #全部字段fields = ["city", "years", "details"]widgets = {"city": widgets.TextInput(attrs={"placeholder": "输入城市:北京/上海/深圳"}),"years": widgets.TextInput(attrs={"placeholder": "输入年限"}),"details": widgets.TextInput(attrs={"placeholder": "输入详情"}),}labels = {"city": "城 市","years": "年 限","details": "详 情",}def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 批量更新class属性for field in self.fields.values():field.widget.attrs.update({'class': 'form-control'})def clean_city(self):"""局部钩子判断城市必须是北京/上海/深圳其中一个"""city_val = self.cleaned_data.get('city', '')if city_val in ["北京", "上海", "深圳"]:return city_valelse:raise forms.ValidationError('城市只能选:北京/上海/深圳')

定义视图

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/class SubmitView(View):def get(self, request):form_obj = SubmitPageFormreturn render(request, "submit.html", locals())def post(self, request):form_obj = SubmitPageForm(request.POST)if form_obj.is_valid():# data = form_obj.cleaned_data()form_obj.save()msg = "保存成功"return HttpResponseRedirect('/total')else:# 全局钩子自定义错误提示获取# print(form_obj.errors.get('__all__'))# error_msg = form_obj.errors.get('__all__')return render(request, "submit.html", locals())

模板内容

模板内容如下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>提交页面</title><meta charset="utf-8"><link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css"><script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script><script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body><div class="container"><form role="form" action="" method="POST" id="detail-form" >{% csrf_token %}{% for field in form_obj %}<div class="form-group">{{ field.label_tag }}{{ field }}<div style="color: red"> {{ field.errors }} </div></div>{% endfor %}<p><input type="submit" value="提交" ></p>
</form>
</div>
</body>
</html>

页面效果

输入不合法的内容,会显示field.errors内容

全局钩子

针对单个字段校验可以用局部钩子实现,如果我们要校验多个字段,比如校验注册的时候输入2次密码一致,可以用全局钩子实现。
定义全局钩子使用clean方法

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/class SubmitPageForm(forms.ModelForm):class Meta:model = Salaryfields = "__all__"  #全部字段# 省略中间代码。。。。。# 全局钩子def clean(self):"""在通过基础验证的干净数据中get获取字段"""pwd1 = self.cleaned_data.get('password')pwd2 = self.cleaned_data.get('password2')if pwd1 and pwd2:  # 这里判断2个字段都是校验通过if pwd1 == pwd2:# 数据没问题,那么原封不动返回即可return self.cleaned_dataelse:# 错误信息储存到 errors {'__all__':[e,]}raise ValidationError('两次密码输入不同')else:return self.cleaned_data

前端可以通过fomr_obj.errors.__all__获取到内置校验器的全部错误信息

python测试开发django-114.ModelForm中局部钩子(clean_)和全局钩子校验相关推荐

  1. python测试开发django(8)--django连接mysql

    前言 Django对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle.本篇以mysql为例简单介绍django连接mysql进行数据操作 Django连m ...

  2. python测试开发django(9)--模型models详解

    前言 Django模型是与数据库相关的,与数据库相关的代码一般写在models.py中,Django支持sqlite3,MySQL,PostgreSQL等数据库 只需要在settings.py中配置即 ...

  3. python测试开发django(20)--admin首页和title修改

    前言 django的admin首页默认显示的"Django管理",title显示的是"Django站点管理员",这里的文案内容可以修改成自己项目的后台页面内容 ...

  4. python测试开发django -141.Bootstrap 面板(Panels)

    前言 面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 元素添加 class .panel 和 class .panel-default 即可 基础面板 不带标题的基本面板 ...

  5. Python测试开发django5.urls.py参数name与a标签的引用

    上一篇,我们学习了Python测试开发django5.templates模板变量传参 如果我们有2个页面home.html和demo.html,两个页面是独立的没有关系的,现在需要从home.html ...

  6. Python测试开发django5.templates模板变量传参

    上一篇,我们学习了Python测试开发django4.templates模板配置 templates模板中html文件是一个静态页面,写四的,如果有时我们想动态的传入一些不同的参数,想实现在一个固定的 ...

  7. 可爱的python测试开发库及项目(python测试开发工具库汇总)

    转载: https://www.jianshu.com/p/ea6f7fb69501 可爱的python测试开发库及项目(python测试开发工具库汇总) github地址 相关书籍下载 Python ...

  8. python 测试开发请关注这个新框架

    如果你之前有接触 python 测试开发,那你应该会听过 django 或者 flask. 但是最近一个新的框架出现在人们的视野中,短短 1 年在 GitHub 上就收集了 20000+ star, ...

  9. 可爱的python测试开发库(python测试开发工具库汇总)

    2019独角兽企业重金招聘Python工程师标准>>> 欢迎转载,转载请注明来源: github地址 谢谢点赞 本文地址 Python测试开发库 参考资料 https://githu ...

  10. Python 测试开发从入门到高手成长之路

    > 文末领取测试开发进阶指南和福利! 在" **质量第一,效率为王** "的移动互联网和大数据时代,互联网 IT 技术团队为了应对产品快速迭代要求,就必须具备持续交付的能力. ...

最新文章

  1. Ubuntu终端远程工具
  2. 在集群服务器进行自定义数据集训练记录过程 TensorBoard logging requires TensorBoard with Python summary writer installed.
  3. boost::pointer_traits用法实例
  4. 将完整的XP(非PE)安装到U盘
  5. CL_CRM_PRODIL_EXTENSION
  6. ubuntu中安装sublime text3用于python编程
  7. C语言作业二选择结构,C语言第二次作业参考答案选择结构.pdf
  8. C++ —— C++高手之路
  9. linux故障模式,Linux操作系统出现严重故障后的救援模式
  10. 《C程序员从校园到职场》一1.2 C语言的主要特点
  11. 玩转接口测试,那些必备的技能
  12. Bailian4123 马走日【DFS】
  13. 计算机基础算术加法,计算机基础第二章:算术逻辑单元(How Computes Calculate——The ALU)...
  14. 工作中个人注册的媒体账号离职要归公司所有?
  15. 用python计算狗的年龄_狗狗年龄与人的年龄的对比:狗的年龄:一年相当于人类的几岁...
  16. dbf是什么文件格式
  17. 最新腾讯防水墙滑块验证码破解,代码可以直接运行
  18. 苹果个人账号转公司账号
  19. mysql 基础选择题_MySQL基础之练习题
  20. 使用html制作一个旅游网站

热门文章

  1. 【线性分类器】(二)“深度学习”的鼻祖——感知器
  2. 机器学习 --- 概率图 - 概述
  3. linux fstab 远程,linux下fstab文件详解
  4. 利用VGA输出音频信号
  5. cad图纸问号怎么转换文字_CAD图纸上字体显示问号怎么办?cad文字显示问号三种解决方法...
  6. python ipo模型是什么意思_IPO里的估值模型是什么情况?
  7. 数据同步工具:Canal
  8. SSD网络结构优劣分析
  9. 全国基础地理数据库数据预处理
  10. 计算机英语(第四版)