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 ...
随机推荐
- java面向对象知识整理(一)
1.面向对象思想 概述:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对像,强调具备功能的对象. 特点:(1)符合人们思考习惯的一种思想. (2)将复杂的事情简单化 ...
- Linux sftp 另外一台机器时,出现:receive message is too long
因为在linux登录时,首先会运行的三个文件是: /etc/profile,/home/用户名/.bashrc,其次是/home/用户名/.bash_profile,出现这个问题的原因是因为在sftp ...
- android利用adb安装应用程序出现“more than one device and emulator wait for device ”
今天,写自动化脚本时,因在这之前进行了一下真机版本的更新,还没有从电脑上拔出,就又在adt打开了一个AVD. 于是,自由自在的就去写脚本了,企图在emulator上装一个APK,在cmd窗口下,利用: ...
- CSS中的块级元素(block)与行内元素(inline)
css中有3种基本的定位机制:普通流(相对定位实际上看做普通流定位模型的一部分)浮动(float)绝对定位(固定定位是绝对定位的一种)所以在学习浮动之前,我们先要了解块级元素与内联元素(行内元素).块 ...
- [转载]MySQL5.6 PERFORMANCE_SCHEMA 说明
背景: MySQL 5.5开始新增一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数.并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储 ...
- 由浅入深SCF无服务器云函数实践
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:陈杰,腾讯云架构平台部技术专家 近年来,互联网服务从一开始的物理服务器托管,虚拟机,容器,发展到现在的云函数,逐步无服务器化,如下表所示. ...
- JavaScript语法详解:JS简介&变量
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. JavaScript简介 Web前端有三层: HTML:从语义的角度,描 ...
- 【JavaScript运算符与表达式】
一.表达式 1.原始表达式:2.14,"test",true/false,null--复合表达式:10*20-- 2.数组.对象的初始化表达式:new Array(1,2),[1, ...
- LightOJ1012-Guilty Prince-DFS
Guilty Prince Time Limit: 2 second(s) Memory Limit: 32 MB Once there was a king named Akbar. He had ...
- 树形dp总结
转自 http://blog.csdn.net/angon823 介绍 1.什么是树型动态规划 顾名思义,树型动态规划就是在"树"的数据结构上的动态规划,平时作的动态规划都是线性的 ...