Django-ModelForm
- 耦合度高,不适用于大程序,适用于小程序
- 功能集成了Django-Models和Django-Form
- 数据库操作
- 表单数据验证
- HTML上次提交的数据
- 初始化显示页面
- 生成HTML标签
1.ModelForm的用法
from django import forms from django.forms import widgets as Fwidgets
from django.forms import fields as Ffields
# 从源码可以看出forms.Form与forms.ModelForm都继承于BaseForm # is_valid、cleaned_data、errors全部继承于BaseForm # 所以验证功能在ModelForm同样适用 calss userInfoModelForm(forms.ModelFrom): #class中不要加每行之间不要增加逗号 class Meta: model = models.UserInfo -->指向对应的model数据类 fields = "__all__" -->指向所有字段 # fields = ["username","email"] # exclude = ["username"] #字典 labels = { -->与model字段中的verbose_name 含义一样,如果不想在model中做过多的操作,也可以在此处添加 "username":“用户名", "emial": "邮箱" ...... } help_text = { "username" : "请填写用户名" -->用户提示 ...... } #注意此处由于字段名与导入的模块名相同,我们我们需要将widgets重命名为Fwidgets否则无法使用 #ModelForm没有自己默认的widgets只能使用Form的插件 widgets = { "username": Fwidgets.Textarea(attrs={"class":"c1"} ...... } -->指定插件 error_messages={ "__all__":{ } "email":{ "require":"邮箱不能为空", "invalid":"邮箱格式错误" } } #Ffield的使用与Fwidgets的使用方法一样,都是因为字段名和模块名重名 field_classes = { "email":Ffields.URLField -->自定义字段类 #在models中email是邮箱字段,我们可以在ModelForm中自定制该字段的类型 } localized_fields = ("ctime",) #本地化,如:根据不同时区显示数据 example: 数据库中 2019-4-13 12:01:00 settings中的配置:——》需要让django知道当前的时区 TIME_ZONE = "Aisa/Shanghai" USE_TZ = True 显示: 2019-4-13 20:01:00
2.ModelForm应用
def index(request): if request.method == "GET": obj = UserInfoModelForm() return render(request, "index.html", {"obj": obj}) elif request.method == "POST": obj = UserInfoModelForm(request.POST) if obj.is_valid(): obj.save()#自动将验证正确的数据添加到数据库中-->单表,一对多,多对多 # 自定制obj.save()保存操作 save==以下三步操作 # instance = obj.save(False) # instance.save() # obj.save_m2m() #print(obj.is_valid()) #print(obj.cleaned_data) #print(obj.errors) return render(request, "index.html", {"obj": obj}) 编辑url: def user_edit(request, nid): if request.method == "GET": user_obj = models.UserInfo.objects.filter(id=nid).first() mf = UserInfoModelForm(instance=user_obj) return render(request, "user_deit.html", {"mf": mf, "nid": nid}) elif request.method == "POST": user_obj = models.UserInfo.objects,.filter(id=nid).first() mf =UserInfoModelForm(request.POST,instance=user_obj) # 如果上面instance不进行初始化,会重新生成一条数据,并不是更新。 if mf.is_valid(): mf.save() else: print(mf.errors.as_json()) reutrn render(request, "user_edit.html",{"mf": mf, "nid":nid}) ModelForm也拥有clean等方法,用法与form一样 同时可以支持在modelForm中自定义生成新的字段,来做局部控制,并不会存入数据库