一、简介与基本使用

简介: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. JS 对象API之判断父对象是否在子对象的原型链上

    语法:父对象.prototype.isPrototypeOf(子对象) 代码栗子: function Student(){ this.name = "小马扎"; ; } var s ...

  2. 用AndroidStudio发布Libs到Bintray jCenter

    1 RootProject[根目录]build.gradle中添加如下插件引用 dependencies { ....... classpath 'com.jfrog.bintray.gradle:g ...

  3. python基础(三)编码,深浅copy

    编码,深浅copy encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算 ...

  4. Spark源码分析 之 Driver和Excutor是怎么跑起来的?(2.2.0版本)

    今天抽空回顾了一下Spark相关的源码,本来想要了解一下Block的管理机制,但是看着看着就回到了SparkContext的创建与使用.正好之前没有正式的整理过这部分的内容,这次就顺带着回顾一下. S ...

  5. c/c++中static的详解

    C 语言的 static 关键字有三种(具体来说是两种)用途: 1. 静态局部变量:用于函数体内部修饰变量,这种变量的生存期长于该函数. int foo(){ ; // note:1 //int i ...

  6. spring官方学习地址

    1.http://projects.spring.io/spring-framework/ 2.https://github.com/spring-projects/spring-mvc-showca ...

  7. Struts2中访问web元素的四种方式

    Struts2中访问web元素的四种方式如下: 通过ActionContext来访问Map类型的request.session.application对象. 通过实现RequestAware.Sess ...

  8. Django权限管理测试

    测试内容:当我单击登录页面登录的时候页面会弹出当前用户的个人信息 当我点击提交的时候可以看到我当前用户的所有权限: 测试成功,接下来看一下后台的简单代码: class User(models.Mode ...

  9. C语言实现整数和16进制互相转换

    编译环境:Dev-C++ 5.2.0.3 使用sprintf()函数实现转换,代码如下: #include <stdio.h> #include <stdlib.h> int ...

  10. deeplearning.ai 卷积神经网络 Week 2 深度卷积网络:实例研究 听课笔记

    1. Case study:学习经典网络的原因是它们可以被迁移到其他任务中. 1.1)几种经典的网络: a)LeNet-5(LeCun et al., 1998. Gradient-based lea ...