django-ModelForm

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中自定义生成新的字段,来做局部控制,并不会存入数据库
原文地址:https://www.cnblogs.com/wangxingwei/p/10709800.html