一、简介与基本使用

简介: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. 《UNIX环境高级编程》第七章进程环境

    7.2 main函数 1.C程序总是从main函数开始执行的,原型:int main(int argc,char *argv[]);argc是命令行参数的个数argc是指向参数的各个指针所构成的数组2 ...

  2. Effective Java 第三版——17. 最小化可变性

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  3. Python面向对象篇(1)-类和对象

    面向对象编程 1.编程范式   我们写代码的目的是什么?就是为了能够让计算机识别我们所写的代码并完成我们的需求,规范点说,就是通过编程,用特定的语法+数据结构+特殊算法来让计算机执行特定的功能,实现一 ...

  4. mysql启动日志文件log_bin

    今天正在无所事事的时候,突然收到需要我打开mysql的log_bin,当时我就懵逼了...不多说别的,我连这个log_bin在哪里,怎么知道是否启动了都不知道,怎么去做? 在万分纠结下,查询了很多资料 ...

  5. Ftplib模块的用法

    login(user='',passwd='', acct='') 登录到FTP 服务器,所有的参数都是可选的 pwd() 当前工作目录 cwd(path) 把当前工作目录设置为path dir([p ...

  6. unisound_asr 云知声 语音识别 python版接口

    抽空,实现了一份云知声 语音转写的python版本. 使用python通过调用动态库实现. 云知声官网: http://dev.hivoice.cn/sdk_download/schema_sdk.j ...

  7. LevelDB的源码阅读(二) Open操作

    在Linux上leveldb的安装和使用中我们写了一个测试代码,内容如下: #include "leveldb/db.h" #include <cassert> #in ...

  8. 针对Oracle的审计方案

    主题:针对Oracle的审计方案 数据库环境:Oracle 11g 数据库审计需求: 1.需要对连接数据库的行为进行审计 2.需要对核心表的DML操作进行审计 3.需要迁移审计数据到指定表空间 4.需 ...

  9. AOP---jdk动态代理的思考

    引出问题:动态代理中是谁调用了invoke方法 为了更好的说明情况,我先写一个动态代理类 a.Person类 public interface Person { public void eating( ...

  10. JAVA实用案例之文件导出(JasperReport踩坑实录)

    写在最前面 想想来新公司也快五个月了,恍惚一瞬间. 翻了翻博客,因为太忙,也有将近五个多月没认真总结过了. 正好趁着今天老婆出门团建的机会,记录下最近这段时间遇到的大坑-JasperReport. 六 ...