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

一、ModelForm的用法

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

说明:

1.model:对应得表名

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

3.exclude:排除字段列表

4.widgets:插件列表

5.labels:前端显示字段名

6.error_messages:自定义错误提示

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

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

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

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

{{ model_form.errors }}

{% csrf_token %}

{% for field in model_form %}

{% if field.field.required %}

{{ field.label }} (*必填项)

{% else %}

{{ field.label }}

{% endif %}

{{ field.errors }}

{{ field }}

{% endfor %}

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

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

二、有多个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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值