一、简介与基本使用 |
简介: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()