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()
原文地址:https://www.cnblogs.com/wdliu/p/8178333.html