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

 

1.2 实例理解
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re from django import forms
from django.forms import widgets as Mwidgets
from django.forms import fields as Mfields
from django.forms import ValidationError from cmdb import models class UserModelForm(forms.ModelForm): session_checkbox = Mfields.ChoiceField(
choices=(
(0, "默认每次输入密码"),
(1, "一周免登陆"),
(4, "一个月免登陆"),
),
# widget=Mwidgets.CheckboxInput
) is_login = Mfields.CharField(
label= "一年免登陆",
widget= Mwidgets.CheckboxInput()
) class Meta:
model = models.User
# fields = "__all__" #所有字段都验证生成
fields = ["name", "email", "wechat", "phone",] #从表中选出字段验证生成
exclude = ["password", "ctime"] #除了选中的字段都验证生成 labels = { #前端生成 labels 给字段别名,使用中文不使用数据库字段名
"name": "用户名:",
"email": "邮箱:",
"wechat": "微信",
"phone": "手机号:" }
widgets = {
"name": Mwidgets.TextInput(attrs={"class": "c1", "value": "请输入用户名"}),
"email": Mwidgets.Textarea(attrs={"class": "c2"})
} error_messages = {
"email": {
"required": "邮箱必填",
"invalid": "邮箱格式有误"
},
"phone": {
"required": "电话号码为必填",
"invalid": "手机号有误"
}
} #因为本身 ModelForm 继承了 Form
#所以可以用 Form预留的钩子来做验证 def clean_phone(self):
"""
class BaseForm:
.....
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
....
self.is_bound = data is not None or files is not None
self.data = {} if data is None else data
"""
#上面为BaseForm源码, 当在 POST 方法中实例化Form 或者 ModleForm 时,requestPOST 就被传入 self.data中了
#所以 所有字典的方法 self.data都可用了,建议使用dict.get()方式取数据
phone_number = self.data.get("phone", None)
if not phone_number:
raise ValidationError("电话号不能为空")
mobile_pattern = '^13[0-8]{1}\d{8}'
if not re.match(mobile_pattern, str(phone_number)):
raise ValidationError("手机号格式有误")
return phone_number # 将正确的 value 电话号返回去 #以下为预留钩子源码
# if hasattr(self, 'clean_%s' % name):
# value = getattr(self, 'clean_%s' % name)()
# 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. Android 加了自定义Application后报错 Unable to instantiate activity ComponentInfo ClassNotFoundException

    在Android自定义一个类继承集成Application后,并在AndroidManifest.xml里面配置了application的name属性为该类名称后报错: Unable to insta ...

  2. c/c++ 线性表之单向循环链表

    c/c++ 线性表之单向循环链表 线性表之单向循环链表 不是存放在连续的内存空间,链表中的每个节点的next都指向下一个节点,最后一个节点的下一个节点不是NULL,而是头节点.因为头尾相连,所以叫单向 ...

  3. Linux补充

    1.从国内豆瓣源安装软件 pip install -i https://pypi.doubanio.com/simple paramiko --trusted-host pypi.douban.com

  4. Docker: docker container常用命令实战(2)-数据持久化

    应用服务是在容器中运行的,容器随时会被删除,如果是个mysql容器呢?数据存储在容器里,容器删除了,数据也没了,那就是个噩梦. 所以一些数据是需要存储在容器之外的,可以是宿主机,可以是网络存储位置上, ...

  5. Eric Chen Mock Interview

    Given an array with integers. Find two non-overlapping subarrays A and B, which |SUM(A) - SUM(B)| is ...

  6. props default 数组/对象的默认值应当由一个工厂函数返回

    export default {props: { slides:{ type:Array, default:[] } },这是我的代码 报错是Invalid default value for pro ...

  7. cf 20190307 Codeforces Round #543 (Div. 2, based on Technocup 2019 Final Round)

    B. Mike and Children time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  8. Android自动登录功能的实现

    登陆页面布局设计: <LinearLayout android:layout_width="wrap_content" android:layout_height=" ...

  9. spring程序打包使用该插件,不然容易报错xsd找不到

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade ...

  10. P2370 yyy2015c01的U盘(二分+背包)

    思路:先说一下题意吧.就是给你n个文件大小为v,价值为c, 但是硬盘的大小为S, 而且要存的总价值大于等于p.问每次传输k大小的文件.问k的最大值是多少? 我们以k为二分对象. 直接讲检验函数吧. 假 ...