zoukankan      html  css  js  c++  java
  • form,model,modelform的区别

    一,三者的区别:

    1,model 强大的数据库操作功能,弱小的数据验证功能
    a,验证
    full_clean ->字段正则判断-->clean方法(钩子)

    2,form 强大的数据验证功能
    is_valid() ->full_clean()->
    ->每个字段的正则,每个字段的方法 clean_字段名()
    ->_clean_form ->clean()钩子
    ->_post_clean(钩子)
    ----》
    返回值is_valid()
    cleaned_data
    errors
    3,modelform 强大是数据验证,适中的数据操作

    二,补充

    1,choice的补充:数据库更新后对应的网页文件也更新

    form文件:

    class UserForm(forms.Form):
        username=fields.CharField(label='用户名')
        email=fields.EmailField(label='邮箱')
        #前端用 obj.as_p,obj.as_table,obj.as_ul 一次性展示全部展示,后面的表示标签的嵌套
        
            user_type1=fields.ChoiceField(choices=model.UserTyep.objects.values_list('id','name'))
        user_type2=fields.ModelChoiceField(queryset=models.UserType.objects.all())
        def __init__(self,*args,**kwargs):
            super(UserForm,self).__init__(*args,**kwargs)
            self.fields['user_type1'].widget.choices=models.UserType.objects.all().value_list('id','name')

    models文件:

    class UserType(models.Model):
        name=models.CharField(max_length=10)
        def __str__(self):
        #用方法二时要添加的
            return self.name

     三,modelForm的强大功能

    1,创建modelForm对象

    class UserModelForm(forms.ModelForm):
        class Meta:
            #元信息
            model=model.User  #表名
            fields="__all__"  #字段名

    2,自动保存的功能

    #保存数据
    def index(request):
        if request.method=="GET":
            obj=UserModelForm()
            return render(request,'mf.html',{'obj':obj})
        elif request.method=='POST':
            obj=UserModelForm(request.POST)
            if obj.is_valid():
                #保存添加的数据
                #models.User.objects.create(**obj.cleaned_data)    
                #obj.save()
                #ModelForm提供的save方法可以自动保存,同时可以自动保存多对多的第三张表的数据。
                #第三张表的数据想要单独保存也可以
                #obj.save(commit=True) 与下面的代码等效
                mobj=obj.save(commit=False)
                mobj.save_m2m()  保存对应的第三张表的数据
                
                return render(request,'mf.html',{'obj':obj})

    3,更新数据

    #更新数据
    def edit_index(request,nid):
        if request.method=="GET":
            model_obj=models.User.objects.get(id=nid)
            obj=UserModelForm(instance=model_obj)
            return render(request,'mf1.html',{'obj':obj,'nid':nid})
        elif request.method=='POST':
            model_obj=models.User.objects.get(id=nid)
            obj=UserModelForm(request.POST,instance=model_obj)
            if obj.is_valid():
                #保存添加的数据
                #models.User.objects.create(**obj.cleaned_data)    
                obj.save
                #ModelForm提供的save方法可以自动保存,同时可以自动保存多对多的第三张表的数据。
                #第三张表的数据想要单独保存也可以
            return render(request,'mf1.html',{'obj':obj})

    资源来源:
    model:           http://www.cnblogs.com/wupeiqi/articles/6216618.html
    form :             http://www.cnblogs.com/wupeiqi/articles/6144178.html
    modelform:            http://www.cnblogs.com/wupeiqi/articles/6229414.html

  • 相关阅读:
    LeetCode题目:Gray Code
    LeetCode题目: Remove Duplicate Letters
    非阻塞socket中read、write返回值
    C连接MySql
    使用GDB调试程序
    C语言中使用库函数解析命令行参数
    把服务器当网盘玩 教你从云服务器下载自己的文件
    微信小程序 地图选点 获取用户选择的定位信息 wx.chooseLocation
    如何避免高不成低不就? 疫情当下Java学习路线分享
    微信小程序 获取手机号 JS
  • 原文地址:https://www.cnblogs.com/gjx1212/p/13845623.html
Copyright © 2011-2022 走看看