ModelForm使用

使用

定制表

from django.forms import ModelForm
from . import models


class CustomerForm(ModelForm):
“””
定制ModelForm表
“””
class Meta:
model = models.CustomerInfo	# 跟表关联
fields = [‘name’, ‘consultant’, ‘status’]

在view中使用

def index(request):
form = forms.CustomerForm()
return render(request, ‘index.html’, {‘forms’: form})

前端使用

{{ forms }}

生成动态的ModelForm

Djangoadmin中,在进行数据添加的时候,会根据表的字段的不同生成对应的表单,那么admin是如何得知我们的表中都有哪些字段呢?其实这个很简单,直接在class Meta中使用fields = “__all__”就可以加载我们表中所有的字段,那么还有一个问题,根据这些,就可以针对每个表生成不同的表单,但是在创建ModelForm对象的时候是否是每一个表都要写一个ModelForm类呢?这样做显然会很麻烦,其实有更简单的方法,就是动态的生成ModelForm,而实现动态ModelForm的方法即使通过type创建类,如下:

from django.forms import ModelForm


def create_dynamic_model_form(model):
    """
    通过type动态的创建ModelForm类对象
model为我们在model.py中定义的类
    :param admin_class:
    :return:
    """
    class Meta:
        model = model
        fields = "__all__"

    return type("DynamicModelForm", (ModelForm, ), {"Meta": Meta})

为字段对应的表单元素添加属性

在使用modelform自动生成input表单的时候,样式都是原始的,为了能给表单设置样式就必须给表单添加相应的class属性,那么如何在生成表单标签的时候添加class属性呢?其实modelform所有的表单标签都是在__new__方法中生成的,所以可以在__new__中去给这些表单添加属性,如下:

def create_dynamic_model_form(admin_class):
    """
    通过type动态的创建ModelForm类对象
    :param admin_class:
    :return:
    """
    class Meta:
        model = admin_class.model
        fields = "__all__"

    def __new__(cls, *args, **kwargs):
        # 循环所有的字段
        for filed_name in cls.base_fields:
            field_obj = cls.base_fields[filed_name]
            field_obj.widget.attrs.update({'class': 'form-control'})
        return ModelForm.__new__(cls)

    return type("DynamicModelForm", (ModelForm, ), {"Meta": Meta, '__new__': __new__})

 

posted @ 2019-06-30 15:11  Jin同学  阅读(277)  评论(0)    收藏  举报