表单_ModelForm

本文介绍了Django的ModelForm组件,它是Model和Form的结合体,简化了数据验证和数据库操作。全验证意味着所有模型字段都需要验证,部分验证则可以选择验证部分字段。ModelForm的属性、自定义错误信息、验证器、save()方法等特性被详细阐述,包括如何进行数据更新和原生SQL操作。此外,文章讨论了ModelForm在前后端分离和模型、表单分离场景下的使用注意事项。
摘要由CSDN通过智能技术生成

前言

1、在写表单的时候,会发现表单中的Field和模型中的Field基本上是一模一样的。而且一般情况下表单中需要验证的数据就是我们模型中需要保存的数据。那么这个时候我们就可以将模型中的字段和表单中的字段进行绑定

2、比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱好,邮箱,电话,住址,注册时间等等一大堆信息,现在让你写一个创建学生的页面,你的后台应该怎么写呢?
    ⑴前端:首先会在前端一个一个罗列出这些字段,让用户去填写,然后后台一个一个接收用户的输入
    ⑵后台:定义一个学生模型,用来保存学生信息
    ⑶后台:定义一个学生表单,用来验证前端传递过来的数据
    ⑷后台:在视图函数中使用get()方法来一个一个的获取已通过验证的数据,然后使用模型中的QuerySet方法将数据保存起来

3、在上面示例中:其实表单的定义和模型的定义其实是差不多的,但是如果按照上面这种方式来的话,一个差不多的东西我们就需要完整的定义两边,这样就显得混麻烦了

4、因此Django就提供了ModelForm组件:这个组件主要就是用来整合表单和模型,将它们两个连接起来使用。就不需要完整的定义两次了

例1:
⑴编辑视图

 ⑵官方文档:https://docs.djangoproject.com/en/dev/topics/forms/modelforms/

 

 

ModelForm组件

1、ModelForm顾名思义就Form和Django的Model数据库模型结合体,可以简单、方便得对数据库进行增加、编辑操作和验证标签的生成

2、Django中Model负责操作数据库,并且具有简单的数据库验证功能(基本不用);Form用于用户请求的验证,具有强悍的数据库验证功能;ModelForm是将二者合二为一,即可用于数据库操作(部分),也可用于用户请求的验证(部分)。但由于ModelForm的耦合性太强,其作用一般用作于结构简单的小站点

3、Form组件和ModelForm的区别
    ⑴ModelForm是Django Model.py和Form组件的结合体,可以简单、快速使用 Form验证和数据库操作功能,但不如Form组件灵活
    ⑵如果在使用Django做web开发过程中验证的数据和数据库字段相关(可以对表进行增、删、改操),建议优先使用ModelForm,用起来更方便些
    ⑶但是在使用ModelForm的时候慎用fields='__all__',获取数据库所有字段势必造成性能损耗

4、适用场景:
    ⑴ModelForm:中小型应用程序。因为ModelForm是依赖于models的。
    ⑵Form:大型应用程序

 

ModelForm所有属性

class Meta:
            model,                           # 对应Model的
            fields=None,                     # 字段
            exclude=None,                    # 排除字段
            labels=None,                     # 提示信息
            help_texts=None,                 # 帮助提示信息
            widgets=None,                    # 自定义插件
            error_messages=None,             # 自定义错误信息
            field_classes=None               # 自定义字段类 (也可以自定义字段)
            localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据

 

全验证

全验证的意思就是:模型中的字段全部需要在表单中进行验证,并且验证后的所有字段都需要进行数据库操作

例2:
⑴定义模型

⑵定义表单

⑶编辑视图

⑷访问:正确

优化一下下面的代码def FileUploads_modelform(request): """ 批量上传文件 方法三:采用modelform上传,超级简单,只需要实例化表单的时候 接收一下表单里边字符串数据和文件,然后利用表单的save()方法保存一下数据即可 :param request: :return: """ # 判断提交方式GET 或POST if request.method == 'POST': File_ModelForm = FileUpload_ModelForm(request.POST, request.FILES) # 实例化FileUploadForm表单,注意获取数据的方式 if File_ModelForm.is_valid(): # file = File_ModelForm.cleaned_data['file'] # 对于文件,自动保存 # 字段+上传路径自动保存到数据库 # file_form = File_ModelForm.save() # 保存表单到数据库 # 多属性保存 Upload_File = File_ModelForm.save(commit=False) # Upload_File.file_url = Upload_File.file_url.temporary_file_path() # 文件路径 # 调用get_optimized_file_type函数获取优化文件类型 # optimized_file_type = get_optimized_file_type(Upload_File.file_url) Upload_File.file_name = Upload_File.file_url.name # 文件名 Upload_File.file_size = Upload_File.file_url.size # 文件大小 Upload_File.file_update_author = request.user.realname # 获取文件类型 # Get the file content type uploaded_file_type, encoding = mimetypes.guess_type(Upload_File.file_url.path) Upload_File.file_type = uploaded_file_type # Upload_File.file_type = Upload_File.file_url.content_type # optimized_file_type = get_optimized_file_type(file_url) Upload_File.save() # 其他操作,例如返回成功页面或其他处理 # return render(request, 'zadmin/pages/File_Uploads.html', {'file_form': file_form}) return HttpResponse("文件上传成功!") else: file_form = FileUpload_ModelForm() return render(request, 'zadmin/pages/File_Uploads.html', {'file_form': file_form})
最新发布
07-15
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值