• 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中自定义生成新的字段,来做局部控制,并不会存入数据库
  • 相关阅读:
    java面向对象
    java 继承
    .net的 http 请求 利用单例减少创建销毁的资源开销 提高利用率
    net core 3.1 swagger文档添加 不用xml配置
    vs code 配置 golang 环境
    .net 使用RabbitMQ demo
    Centos7 上安装配置 RabbitMQ
    C# .net 获取程序运行的路径的几种方法
    c# Windows服务应用程序的创建、安装和卸载
    XCOPY命令 windows 一个文件夹里的文件 快速移到另一个磁盘里
  • 原文地址:https://www.cnblogs.com/wangxingwei/p/10709800.html
Copyright © 2020-2023  润新知