一、简介与基本使用

简介: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组件的更多相关文章

  1. Django 之 ModelForm 组件

    Django的model form组件 扩展:Django 之Form组件 首先我们要知道 Model 和 Form 分别时干什么的 Model  生成表数据 Form  对表单.字段进行校验 Dja ...

  2. 【Django】--ModelForm组件

    ModelForm a.class Meta: model,#对应Model的 fields=None,#字段 exclude=None,#排除字段 labels=None,#提示信息 help_te ...

  3. Django的ModelForm组件

    创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import mode ...

  4. 框架----Django之ModelForm组件

    ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信 ...

  5. 6月28日 Django form组件 和 modelform组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  6. Django 之Form组件

    Django之From组件 扩展:Django 之 ModelForm组件 Form组件功能 Django的Form主要具有一下几大功能 生成HTML标签 验证用户数据(显示错误信息) HTML Fo ...

  7. django中forms和modelform组件的区别

    首先,我们来看看modelform的实现 model.py class Book(models.Model): title=models.CharField(max_length=32) price= ...

  8. Django之Form、ModelForm 组件

    Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...

  9. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

随机推荐

  1. Git添加远程库和从远程库中获取

    一. Git添加远程库 1. 在本地新建一个文件夹,在该文件夹使用Git工具,运行$ git init,将该文件夹变为本地Git仓库,同时会生成一个隐藏的.git文件夹. 2. 在该文件夹中用Note ...

  2. 析构函数(C#)

    析构函数又称终结器,用于析构类的实例. 定义 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数.析构函数往往用来做&quo ...

  3. 客户端 未登录页面 (clearfix 分割线)

    做了一个手机客户端页面,未登录的状态页面 类似 如上图所示 这样 上面列表采取80%宽度,右侧浮动.ul li设置绝对定位.左边icon图标采取决定定位. 为了防止小屏幕手机左边空白缝隙过小,事先给外 ...

  4. 强化学习之Sarsa (时间差分学习)

    上篇文章讲到Q-learning, Sarsa与Q-learning的在决策上是完全相同的,不同之处在于学习的方式上 这次我们用openai gym的Taxi来做演示 Taxi是一个出租车的游戏,把顾 ...

  5. HTTP 错误 500.19 - Internal Server Error 0x80070005 0x80070003

    IIS发布时错误 错误代码 0x80070005 一.权限:设置文件权限--属性-安全-添加everyone的读取权限(注意是给整个发布文件设置权限而不是config) 二.查看物理路径中是否存在中文 ...

  6. 【树链剖分】洛谷P3384树剖模板

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...

  7. linux系统的磁盘空间限制的两种方法

    最近在搞VPS,要用到磁盘的限额,在网上找了一些相关的资料,总结起来,有两个方法能实现,一是用quota,另外一种是限制目录大小,下面我就将这两种方法写出来,与大家一起分享! 首先我们来看第一种方法, ...

  8. Core Animation 文档翻译 (第二篇)

    Core Animation 文档翻译 (第二篇) 核心动画基础要素 核心动画为我们APP内Views动画和其他可视化元素动画提供了综合性的实现体系.核心动画不是我们APP内Views的替代品,相反, ...

  9. Java集合系列[2]----LinkedList源码分析

    上篇我们分析了ArrayList的底层实现,知道了ArrayList底层是基于数组实现的,因此具有查找修改快而插入删除慢的特点.本篇介绍的LinkedList是List接口的另一种实现,它的底层是基于 ...

  10. JavaScript基础知识(数据类型及转换、运算符)

    9.数据类型 概念:表示当前存储的数据的分类(表示数字 - 整数和小数) u  原始类型(原始值) -----[typeof运算符:判断变量的原始类型] *number(数字):表示数字        ...