Django 之 ModelForm组件
Django内部封装的 ModelForm组件,是Django 框架里 model与form组件的结合体,拥有models和Form的所有功能。ModelForm组件与Form组件继承的是同一个类。
引用方法:
from django.forms import ModelForm
基本语法:
from django.forms import ModelForm from django.forms import fields from django.forms import widgets class TestForm(ModelForm): 字段 = fields.CharField() #覆盖 class Meta: 该类下的主要方法,请看下面详解 #也可以自定义字段的验证规则 def clean_字段名(self): pass
参数及应用详解:
ModelForm a. class Meta: model, # 对应Model的数据,注意只能是一张表,多了不行!表内有Fk or M2M .. 可以进行连表操作 fields=None, # 字段 '__all__' 代表所有字段 exclude=None, # 排除字段 不显示某个或是多个字段 [] labels=None, # 提示信息 {} help_texts=None, # 帮助提示信息 {} widgets=None, # 自定义插件 {} error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS) field_classes=None # 自定义字段类 (也可以自定义字段) {} localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据 如: 数据库中 2016-12-27 04:10:57 setting中的配置 TIME_ZONE = 'Asia/Shanghai' USE_TZ = True 则显示: 2016-12-27 12:10:57 b. 验证执行过程 is_valid -> full_clean -> 钩子 -> 整体错误 c. 字典字段验证 def clean_字段名(self): # 可以抛出异常 # from django.core.exceptions import ValidationError return "新值" d. 用于验证 model_form_obj = XXOOModelForm() #实例化对象 model_form_obj.is_valid() #验证 model_form_obj.errors.as_json() #错误信息 model_form_obj.clean() model_form_obj.cleaned_data #验证之后的值 e. 用于创建 model_form_obj = XXOOModelForm(request.POST) #### 页面显示,并提交 ##### # 默认保存多对多 obj = form.save(commit=True) # 不做任何操作,内部定义 save_m2m(用于保存多对多) obj = form.save(commit=False) obj.save() # 保存单表信息 obj.save_m2m() # 保存关联多对多信息 f. 用于更新和初始化 obj = model.tb.objects.get(id=1) model_form_obj = XXOOModelForm(request.POST,instance=obj) ... PS: 单纯初始化 model_form_obj = XXOOModelForm(instance=obj)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class TestModelForm(ModelForm): user = ffields.EmailField(label='用户名') #覆盖原方法,执行重写字段方法 class Meta: model = models.UserInfo fields = "__all__" error_messages = { 'user':{'required':'用户名不能为空'}, 'email':{'required':'邮箱不能为空','invalid':'邮箱格式错误'}, } labels = { 'user': '用户名', 'email': "邮箱" } help_texts = { 'user': "帮你一下" } #插件 widgets = { 'user': fwidgets.Textarea(attrs={'class':'c1'}) } #重写字段类 field_classes = { 'user': ffields.EmailField } # def clean_user(self): # pass # # def clean_email(self): # pass def test(request): if request.method == "GET": form = TestModelForm() context = { 'form': form } return render(request,'test.html',context) else: form = TestModelForm(request.POST) if form.is_valid(): form.save() return redirect('http://www.oldboyedu.com') context = { 'form': form } return render(request, 'test.html', context) def edit(request,nid): obj = models.UserInfo.objects.filter(id=nid).first() if request.method == "GET": form = TestModelForm(instance=obj) context = { 'form': form } return render(request, 'edit.html', context) else: form = TestModelForm(instance=obj,data=request.POST,files=request.FILES) if form.is_valid(): form.save() return redirect('http://www.oldboyedu.com') context = { 'form': form } return render(request, 'test.html', context)
注意点:
1、ModelForm中初始化传值使用的是instance = obj,传值是个对象,这里是与Form组件(install={})的不同点。
2、ModelForm往数据库中保存数据仅有一个操作:save(),如果创建的ModelForm的对象,传值没有 instance=obj 初始值,那他会向数据库添加一条数据;若是有是对相应数据进行更改。