博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 统一动态创建多个model对应的modelForm类(type()函数)
阅读量:5319 次
发布时间:2019-06-14

本文共 2796 字,大约阅读时间需要 9 分钟。

一、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展示

{
{ model_form.errors }}
{% csrf_token %} {% for field in model_form %}
{
{ field.errors }}
{
{ field }}
{% endfor %}

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 
= customer
ModelForm(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

你可能感兴趣的文章
div水平居中且垂直居中
查看>>
epoll使用具体解释(精髓)
查看>>
AndroidArchitecture
查看>>
原生JavaScript第六篇
查看>>
安装Endnote X6,但Word插件显示的总是Endnote Web"解决办法
查看>>
python全栈 计算机硬件管理 —— 硬件
查看>>
大数据学习
查看>>
简单工厂模式
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>