一、ModelForm
  • 源码
  1. class ModelForm(BaseModelForm, metaclass=ModelFormMetaclass):
  2. pass
  3. def modelform_factory(model, form=ModelForm, fields=None, exclude=None,
  4. formfield_callback=None, widgets=None, localized_fields=None,
  5. labels=None, help_texts=None, error_messages=None,
  6. field_classes=None):

 

1.2 实例理解
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import re
  4. from django import forms
  5. from django.forms import widgets as Mwidgets
  6. from django.forms import fields as Mfields
  7. from django.forms import ValidationError
  8. from cmdb import models
  9. class UserModelForm(forms.ModelForm):
  10. session_checkbox = Mfields.ChoiceField(
  11. choices=(
  12. (0, "默认每次输入密码"),
  13. (1, "一周免登陆"),
  14. (4, "一个月免登陆"),
  15. ),
  16. # widget=Mwidgets.CheckboxInput
  17. )
  18. is_login = Mfields.CharField(
  19. label= "一年免登陆",
  20. widget= Mwidgets.CheckboxInput()
  21. )
  22. class Meta:
  23. model = models.User
  24. # fields = "__all__" #所有字段都验证生成
  25. fields = ["name", "email", "wechat", "phone",] #从表中选出字段验证生成
  26. exclude = ["password", "ctime"] #除了选中的字段都验证生成
  27. labels = { #前端生成 labels 给字段别名,使用中文不使用数据库字段名
  28. "name": "用户名:",
  29. "email": "邮箱:",
  30. "wechat": "微信",
  31. "phone": "手机号:"
  32. }
  33. widgets = {
  34. "name": Mwidgets.TextInput(attrs={"class": "c1", "value": "请输入用户名"}),
  35. "email": Mwidgets.Textarea(attrs={"class": "c2"})
  36. }
  37. error_messages = {
  38. "email": {
  39. "required": "邮箱必填",
  40. "invalid": "邮箱格式有误"
  41. },
  42. "phone": {
  43. "required": "电话号码为必填",
  44. "invalid": "手机号有误"
  45. }
  46. }
  47. #因为本身 ModelForm 继承了 Form
  48. #所以可以用 Form预留的钩子来做验证
  49. def clean_phone(self):
  50. """
  51. class BaseForm:
  52. .....
  53. def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
  54. ....
  55. self.is_bound = data is not None or files is not None
  56. self.data = {} if data is None else data
  57. """
  58. #上面为BaseForm源码, 当在 POST 方法中实例化Form 或者 ModleForm 时,requestPOST 就被传入 self.data中了
  59. #所以 所有字典的方法 self.data都可用了,建议使用dict.get()方式取数据
  60. phone_number = self.data.get("phone", None)
  61. if not phone_number:
  62. raise ValidationError("电话号不能为空")
  63. mobile_pattern = '^13[0-8]{1}\d{8}'
  64. if not re.match(mobile_pattern, str(phone_number)):
  65. raise ValidationError("手机号格式有误")
  66. return phone_number # 将正确的 value 电话号返回去
  67. #以下为预留钩子源码
  68. # if hasattr(self, 'clean_%s' % name):
  69. # value = getattr(self, 'clean_%s' % name)()
  70. # self.cleaned_data[name] = value 返回的正确值被加入到 self.cleaned_data[name] 中,name为字段名

Django 中的Form、ModelForm的更多相关文章

  1. Django中的Form表单

    Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...

  2. Django中的Form

    Form 一.使用Form Django中的Form使用时一般有两种功能: 1.生成html标签 2.验证输入内容 要想使用django提供的form,要在views里导入form模块 from dj ...

  3. Django中的form组件

    Django中的form组件有两大作用 1.验证获取正确的结果或者错误信息 2.生成html代码 一.为什么需要form组件呢? 在写form表单,提交数据时,自己写验证的代码是一件非常困难的事情. ...

  4. 转 Django中的Form

    https://www.cnblogs.com/chenchao1990/p/5284237.html Form 一.使用Form Django中的Form使用时一般有两种功能: 1.生成html标签 ...

  5. django中的Form和ModelForm中的问题

    django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新 方法一:重写构造方法,在构造方法中重新去获取值 class UserForm(forms.Form): ...

  6. django基础 -- 10.form , ModelForm ,modelformset

    一.生成页面可用的 HTML标签 1.form 所有内置字段 Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label ...

  7. django中的 form 表单操作

     form组件  1. 能做什么事?   1. 能生成HTML代码  input框   2. 可以校验数据   3. 保留输入的数据   4. 有错误的提示   1. 定义   from django ...

  8. Django中的form设置field的html属性

    在Django中无论何种field,都有一个widget的属性: class Field(object): widget = TextInput # Default widget to use whe ...

  9. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

随机推荐

  1. c/c++ 用普利姆(prim)算法构造最小生成树

    c/c++ 用普利姆(prim)算法构造最小生成树 最小生成树(Minimum Cost Spanning Tree)的概念: ​ 假设要在n个城市之间建立公路,则连通n个城市只需要n-1条线路.这时 ...

  2. iOS图片存在本地、再从本地获取图片

    图片存在本地.再从本地获取图片 //将图片保存到本地 + (void)SaveImageToLocal:(UIImage*)image Keys:(NSString*)key {     NSUser ...

  3. 4.7Python数据处理篇之Matplotlib系列(七)---matplotlib原理分析

    目录 目录 前言 (一)总框架分析 (二)函数式的绘图 1.说明: 2.函数绘图的缺优点 3.绘图类的函数 4.操作类的函数 5.例子: (三)面向对象式的绘图 1.基本概念 2.基本对象 3.面向对 ...

  4. 【Linux基础】VM使用

    VM三种联网方法和原理 (1)Bridged桥接 使用VMnet0虚拟交换机,此时虚拟机相当与网络上的一台独立计算机与主机一样,拥有一个独立的IP地址,所有机器均可互访,可以联网.使用桥接方式,A,A ...

  5. keepalived 安装篇-个人实践-编译安装

    官网地址:http://www.keepalived.org/官网文档:http://www.keepalived.org/documentation.html Keepalived的作用是检测服务器 ...

  6. 设计模式のMediatorPattern(中介者模式)----行为模式

    一.产生背景 从生活中的例子可以看出,不论是QQ游戏还是QQ群,它们都是充当一个中间平台,QQ用户可以登录这个中间平台与其他QQ用户进行交流,如果没有这些中间平台,我们如果想与朋友进行聊天的话,可能就 ...

  7. Nginx+Keepalived双机热备

    一.Keepalived Keepalived是保证集群高可用的服务软件.网络中优先级高的节点为master负责响应VIP的ARP包,将VIP和MAC地址映射关系告诉网络内其他主机,还会以多播的形式向 ...

  8. SQlite源码分析--源网站

    http://huili.github.io/B-treeImplementation/hierarchicalorganization.html SQLite中的B-tree SQLite中每个数据 ...

  9. cents上运行wget报错:unable to resolve host address

    wget命令报错.无法解析域名"www.keepalived.rog" [vagrant@RS1 download]$ wget http://www.keepalived.org ...

  10. UVA11400-Lighting System Design(动态规划基础)

    Problem UVA11400-Lighting System Design Accept: 654  Submit: 4654Time Limit: 3000 mSec Problem Descr ...