Python 统一动态创建多个model对应的modelForm类(type()函数)

一、ModelForm的用法

ModelForm对用户提交的数据有验证功能,但比Form要简单的多

from django.forms import ModelForm # 导入ModelFormclass

customerModelForm(ModelForm):

    class Meta:

        model=models.UserInfo

        fields="__all__"

        labels={

            ‘name‘:‘用户名‘,

            ‘password‘:‘密码‘,

            ‘qq‘:‘qq号‘,

            ‘微信‘:‘微信号‘,

            ‘roles‘:‘角色‘

        }

说明:

  1.model:对应得表名

  2.fields:选择字段列表,‘__all__‘是选择所有字段

  3.exclude:排除字段列表

  4.widgets:插件列表

  5.labels:前端显示字段名

  6.error_messages:自定义错误提示

  7.localized_field:本地化,如:根据不同时区显示数据

除了这些参数,ModelForm和Form一样可以定义局部钩子和全局钩子

2.实例化表单对象,传入模板,同Form

model_form = customerModelForm()

return render(request,"index.html",{"model_form":model_form})

3、前端通过传递的model_form展示

<div class="row">        {{ model_form.errors  }}        <form class="form-horizontal" method="post" >            {% csrf_token %}        {% for field in model_form  %}              <div class="form-group">                <label  class="col-sm-2 " style="font-weight: normal">                    {% if field.field.required %}                        <b> {{ field.label }} (*必填项)  </b>                    {% else %}                        {{ field.label }}                    {% endif %}                </label>                <div class="col-sm-10">                <span style="color: red;">{{ field.errors }}</span>                          {{ field }}                </div>              </div>        {% endfor %}        </form></div>

4、form提交后,后端view通过以下方式,验证提交的表单

model_form = customerModelForm(request.POST)

if model_form.is_valid():

    model_form.save()

5.如果是修改记录,则需要传入记录对象

obj = customerModel.objects.get(id=obj_id) #查到原来的值

model_form = customerModelForm(instance=user_obj) #传入值

model_form = customerModelForm(request.POST, instance=obj) #将原来的值生成新值

if model_form.is_valid():

    model_form.save()

 

二、有多个Model,不想要每个model写一个ModelForm的,采用动态生成ModelForm类的方法

A、动态生成类的函数:type(‘classname‘,(object,),dict(funname=fun))

参数:

1、class的名称,字符串形式;

2、继承的父类集合,注意Python支持多重继承,如果只有一个父类,注意tuple的单元素写法;

3、class的方法名称与函数绑定,这里我们把函数fun绑定到方法名funname上,可以采用:

setattr(classname,"funname",fun)方式替代

例子:
def CreateModelForm(request,admin_obj):    class Meta:        model = admin_obj.model        fields = "__all__"

def __new__(cls, *args, **kwargs):        for field_name,field_obj in cls.base_fields.items():            field_obj.widget.attrs[‘class‘] = ‘form-control‘            if field_name in admin_obj.readonly_fields:                field_obj.widget.attrs[‘disabled‘] = True  #在后台不能通过这种方式修改外键对应的字段,比如consultant        return forms.ModelForm.__new__(cls)

def default_clean(self):        print("cleaned data:",self.cleaned_data)

dynamic_model_form = type("DynamicModelForm",(forms.ModelForm,), {"Meta":Meta})    setattr(dynamic_model_form,"__new__",__new__)    setattr(dynamic_model_form,"clean",default_clean)    return dynamic_model_form

上述例子就可以根据需求动态生成dynamic_model_form了,需要使用的时候调用CreateModelForm函数即可
model_form = forms.CreateModelForm(request,admin_obj=admin_obj)


原文地址:https://www.cnblogs.com/yoyo008/p/9141380.html

时间: 2024-08-01 15:15:04

Python 统一动态创建多个model对应的modelForm类(type()函数)的相关文章

Python中动态创建类实例

Python中动态创建类实例 简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块.如下: def createInstance(module_name, class_name, *args, **kwargs): module_meta = __import__(module_name, globals(), locals(), [class_n

spring 动态创建数据源

项目需求如下,公司对外提供服务,公司本身有个主库,另外公司会为每个新客户创建一个数据库,客户的数据库地址,用户名,密码,都保存在主数据库中.由于不断有新的客户加入,所以要求,项目根据主数据库中的信息,来动态创建数据源. 解决方案: spring提供了一个类,AbstractRoutingDataSource,可以创建多个数据库,并在几个数据库中进行切换.建议读者在读本文之前先了解一下这个类的使用 afterPropertiesSet(), determineCurrentLookupKey(),

C++动态创建类的实例

写在前面:首先声明,C++实际上是不可以动态创建类的实例的. 下面简单做一个解释,所谓动态创建类的实例是指在程序运行过程中创建并使用一个“未知”的类.而“未知”是指在程序编译时并不知道有哪些类是需要动态创建的.对于C++这门语言来说,编译时不知道的类是不可以在运行时使用的.所以我说C++是不可以的. 不过C++可以做到另一件事情,基本可以满足大多数类似的需求. 我描述为通过类名称创建类的实例. 进入正题. 首先描述一下需求: 编写一个程序实现在程序运行过程中通过类名称(即字符串变量)创建该类的实

python面向对象高级:反射、魔法方法、元类

自省/反射什么是反射?自省也称作反射,这个性质展示了某对象是如何在运行期取得自身信息的.并且在python里,反射可以使得程序运行时对象拥有增删改查它本身属性或行为的一种能力如果Python不支持某种形式的自省功能,dir和type内建函数,将很难正常工作.还有那些特殊属性,像__dict__,__name__及__doc__反射的使用场景? 即插即用,即可以事先定义好接口,接口只有在被完成后才会真正执行 比如:如果和别人共同合作开发项目,但是需要用到对方的类的方法,对方还没完成 f1=FtpC

Python 动态创建函数【转】

知乎上也有相似的问题 偶然碰到一个问题,初想是通过动态创建Python函数的方式来解决,于是调研了动态创建Python函数的方法. 定义lambda函数 在Python中定义lambda函数的写法很简单, func = lambda: "foobar" 可以认为lambda函数是最常用的一种方式. 定义局部函数 Python中函数可以在代码块中进行定义,比如decorator就是通过这种方式实现的, def decorator(func): def _(*args, **kwargs)

OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法

<span style="font-size:24px;">//////第一种方法 // NSMutableArray *arr = [NSMutableArray array]; // for (int i = 0; i < 13; i ++) { // [arr addObject:[NSString stringWithFormat:@"lanou%d",i + 1]]; // } // NSLog(@"%@",arr);

python在sqlite动态创建表源码

代码之余,将开发过程中经常用的代码片段备份一下,如下的代码是关于python在sqlite动态创建表的代码,应该能对各位有所用. import sqlite3 as db conn = db.connect('mytest.db')cursor = conn.cursor()cursor.execute("create table person(name text, age text, address text)")print("table created") 原文

用统一的一个结构管理动态创建

#define RUN_TIME(classname) (&classname::runtime) #define DECLARE_DYNAMIC() public: static RUNTIME runtime; virtual char *GetClassName(); virtual char *GetBaseClassName(); static CObject *MyCreate(); #define IMPLEMENT_DYNAMIC(theclass, baseclass)\ RU

python动态创建类的声明

动态创建类的声明 使用内置函数type,原型:class type(name, bases, dict)name是类的名字,相当于__class__bases是类的基类,元组,可以有多个基类,但是基类必须直接或者间接继承自object类,否则会报错dict是类的变量,字典类型,相当于静态变量,与在__init__函数中声明的不同 代码示意片段: class A(object): def __init__(self): print "A init ..." class B(A): def