zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    JS和PYTHON中数据类型比较
    http状态码
    ffmpeg architecture(上)
    降低数值精度以提高深度学习性能
    IaaS、PaaS 和 SaaS:云服务模型概述
    英特尔Intel® Arria® 10 FPGA加速器设计
    基于至强® 平台的内存数据库解决方案
    MLPerf结果证实至强® 可有效助力深度学习训练
    如何从数据角度为人工智能部署做好数据准备
    英特尔内存革新助平安云 Redis 云服务降本增效
  • 原文地址:https://www.cnblogs.com/wdliu/p/8178333.html
Copyright © 2011-2022 走看看