Django之modelform组件
| 一、简介与基本使用 |
简介:django中的modelform组件同时具有model和form作用,但是耦合度比较高,当项目需要拆分时候就比较困难了,所以在使用modelform时候需要先考虑项目的扩展性。
定义:
models.py
from django.db import models # Create your models here.
class Host(models.Model):
hostname=models.CharField(max_length=20,verbose_name="主机名")
ip=models.GenericIPAddressField(verbose_name="IP地址")
hobj = models.ManyToManyField('HostGroup',verbose_name="主机组")
idc=models.ForeignKey('Idc',to_field="id",verbose_name="机房")
def __str__(self):
return self.ip class HostGroup(models.Model):
groupname=models.CharField(max_length=22)
def __str__(self): #__str__方法用于显示选项里面的
return self.groupname class Idc(models.Model):
name=models.CharField(max_length=64)
def __str__(self):
return self.name
modelform定义(只是测试,所以和view函数放在一起了)
from cmdb import models
from django import forms
class HostModelForm(forms.ModelForm):
class Meta:
model=models.Host #指明model来源,model中定义的类
fields='__all__' #指明要验证或者显示的字段,可以自己定制 def mf(request):
if request.method=="GET":
obj=HostModelForm()
return render(request,'modelform.html',{'obj':obj})
html代码:(和form一样用于生成html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ obj.as_p }}
</body>
</html>
| 二、参数介绍 |
class Mate:
model, # 对应Model的
fields=None, # Model中的字段,__all__代表所有字段,定制使用列表列出字段
exclude=None, # 排除Model中的某个字段
labels=None, # 生成html字段显示名称,同model中定义使用verbose_name参数一样一样,但是类型是字典,形如{"字段":"名称"},定义了该名称会覆盖verbose_name
help_texts=None, # 帮助提示信息,类型是字典
widgets=None, # 自定义插件
error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
field_classes=None # 自定义form字段类 (也可以自定义字段),主要用于修改验证的form格式,类型为字典
localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据
如:
数据库中
2016-12-27 04:10:57
setting中的配置
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True
则显示:
2016-12-27 12:10:57
示例:
class HostModelForm(forms.ModelForm):
class Meta:
model=models.Host #指明model来源,model中定义的类
fields='__all__' #指明要验证或者显示的字段,可以自己定制
#fields=["hostname","ip"]
# exclude=['hostname',]#排除某个字段,这样生成的html中不会有该字段
labels={ #标签
"hostname":"主机名",
"ip":"地址"
}
help_texts={ #提示信息
"hostname":"*必填",
"ip":"*必填"
}
widgets={ #生成html的插件
"hostname":Fwidgets.PasswordInput(attrs={"class":"col-md-4"}),
"hobj":Fwidgets.SelectMultiple(),
}
error_messages={ #自定义错误信息
"ip":{
'required':"ip地址不能为空",
'invalid':"地址不合法",
},
"__all__":{}, #整体错误信息定义
}
field_classes={
"hostname":myfields.URLField #重新修改form字段验证
}
| 三、modelform验证验证步骤 |
ModelForml类继承BaseModelForm,BaseModelForm继承BaseForm,而BaseForm中具有is_valid()方法,所以modelform验证顺序和规则是和form是类似的。
验证顺序:
is_valid-->full_clean-->clean_fields-->clean_form-->_post_clean
相关验证方法:
is_valid()#基本验证
errors.as_json()#错误信息
clean()#钩子验证
cleaned_data#验证通过的数据
| 四、modelform数据初始化以及增加和修改 |
1.创建
###自动创建多对多###
obj=HostModelForm(request.POST)
if obj.is_valid():
obj.save() #自动添加,默认参数commit为True ##手动创建多对多####
obj=HostModelForm(request.POST)
instance=obj.save(commit=False) #返回model对象
instance.save() # 保存单表信息
instance.save_m2m() # 保存关联多对多信息
2.修改和初始化数据
###初始化数据(参数是model对象)####
instance=models.Host.objects.get(id=1)
obj=HostModelForm(instance=instance) ####修改##### instance = models.Host.objects.get(id=1)
obj=HostModelForm(request.POST,instance=instance)
if obj.is_valid():
obj.save()
Django之modelform组件的更多相关文章
- Django 之 ModelForm 组件
Django的model form组件 扩展:Django 之Form组件 首先我们要知道 Model 和 Form 分别时干什么的 Model 生成表数据 Form 对表单.字段进行校验 Dja ...
- 【Django】--ModelForm组件
ModelForm a.class Meta: model,#对应Model的 fields=None,#字段 exclude=None,#排除字段 labels=None,#提示信息 help_te ...
- Django的ModelForm组件
创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import mode ...
- 框架----Django之ModelForm组件
ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信 ...
- 6月28日 Django form组件 和 modelform组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django 之Form组件
Django之From组件 扩展:Django 之 ModelForm组件 Form组件功能 Django的Form主要具有一下几大功能 生成HTML标签 验证用户数据(显示错误信息) HTML Fo ...
- django中forms和modelform组件的区别
首先,我们来看看modelform的实现 model.py class Book(models.Model): title=models.CharField(max_length=32) price= ...
- Django之Form、ModelForm 组件
Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...
- {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...
随机推荐
- 微信小程序开发教程目录
本系列教程是自己在工作中使用到而记录的,没有顺序之分 如有错误之处,请给与指正,也不希望误导了别人 微信小程序开发教程目录 微信小程序之注册和入门 微信小程序之HTTPS请求 微信小程序开发之选项卡 ...
- Tsung:开源多协议分布式负载&压力测试工具
Main features High Performance: the load can be distributed on a cluster of client machines Multi-pr ...
- 关于t00ls的挂机脚本
0x00 前言 今天早上发现t00ls上有人发了个挂机脚本,二十四小时刷时间以及刷Tubi. 轻轻松松升级,坐收Tubi成富翁. 代码很简单,就是带上cookie每隔一段时间(比如60秒)去请求一下某 ...
- DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入
0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...
- Transact-SQL参考--学习笔记
基本的就不累赘了. 运算符 除法: dividend / divisor 如果用一个整数的 divisor 去除整数的 dividend,其结果是一个整数,小数部分被截断,如果要有小数可以将divid ...
- 数据结构-堆(应用篇)之堆排序法-C和C++的实现
堆排序 关于堆的内容我们已经在上一节中了解了,本节中将给出一个堆的应用-堆排序. 关于堆的概念可以看上一节,入口:http://www.cnblogs.com/HongYi-Liang/p/78536 ...
- flask-sqlalchemy基本操作数据库
# -*- coding: utf-8 -*- from sqlalchemy.ext.declarative import declarative_base from sqlalchemy impo ...
- python实现求最长子串长度
给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...
- CTF---Web入门第七题 猫抓老鼠
猫抓老鼠分值:10 来源: 实验吧 难度:难 参与人数:8697人 Get Flag:3740人 答题人数:3944人 解题通过率:95% catch!catch!catch!嘿嘿,不多说了,再说剧透 ...
- BZOJ 3668: [Noi2014]起床困难综合症【贪心】
3668: [Noi2014]起床困难综合症 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1305[Submit][St ...