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
在Django的admin中,在进行数据添加的时候,会根据表的字段的不同生成对应的表单,那么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__})