十二、django之ModelForm数据校验

以下例子对数据库表Student进行操作

#models.pyclass  Student(models.Model):
    name = models.CharField(verbose_name=‘名称‘,max_length=10)
    phone = models.CharField(max_length=11,unique=True,verbose_name=‘手机号‘)
    money = models.FloatField(verbose_name=‘钱‘,default=0,null=True)
    addr = models.CharField(verbose_name=‘家庭地址‘, default=‘北京‘, max_length=20)
    work_addr = models.CharField(verbose_name=‘工作地址‘, default=‘北京‘, max_length=20)
    create_time = models.DateTimeField(verbose_name=‘创建时间‘, auto_now_add=True)  # auto_now_add的意思,插入数据的时候,自动取当前时间
    update_time = models.DateTimeField(verbose_name=‘修改时间‘, auto_now=True)

    class Meta:
        verbose_name = ‘学生表‘
        verbose_name_plural = verbose_name
        db_table = ‘student‘

    def __str__(self):
        return self.name

ModelForm

1、定义一个校验的类,用来校验数据

#导入ModelForm模块,用于校验
from django.forms import ModelForm 

#继承ModelForm,对数据库Student进行校验
class StudentForm(ModelForm):
    class Meta:
        model = Student #数据库表名
        fields = ‘__all__‘ #代表所有的字段
        #fields = [‘name‘,‘phone‘] #某个字段
        #exclude = [‘money‘] #排查哪个字段

2、校验

from django.forms import ModelForm
from user.models import Student
from django.views import View
from django.core.paginator import Paginator
from django.http import HttpResponse,JsonResponse

# 继承ModelForm,对数据库Student进行校验
class StudentForm(ModelForm):
    class Meta:
        model = Student
        fields = ‘__all__‘ #代表所有的字段
        # fields = [‘name‘,‘phone‘] #某个字段
        # exclude = [‘money‘] #排查哪个字段

class StudentView(View):
    def get(self,request): #获取列表
        #QuerySet
        limit = request.GET.get(‘limit‘,20) #一页多少条
        page = request.GET.get(‘page‘,1) #第几页
        # 这里不会查询出数据,在后面返回的时候才会查询
        # 所以查询出全部的数据,到返回的时候,返回具体页的值
        all_students = Student.objects.all().values("id","name","phone")
        page_obj = Paginator(all_students,limit)#分页对象
        stus = list(page_obj.get_page(page))#将QuerySet格式转成list
        data = {"error_code":0,"msg":"操作成功","data":stus,"count":page_obj.count}
        return JsonResponse(data,json_dumps_params={"ensure_ascii":False})

    #对post请求进行校验
    def post(self,request):
        # ModelForm模块会自动找到表,根据表字段的要求进行数据校验
        stu_form = StudentForm(request.POST)#校验的结果
        if stu_form.is_valid(): #如果校验的结果是合法的
            # **stu_form.cleaned_data  校验过的post方法传过来的参数
            Student.objects.create(**stu_form.cleaned_data)
            data = {"error_code":0,‘msg‘:‘添加成功‘}
        else:
            data = {"error_code":-1,‘msg‘:stu_form.errors.get_json_data()}
            #stu_form.errors 获取错误信息
        return JsonResponse(data,json_dumps_params={"ensure_ascii":False})
    def put(self,request): #实现部分修改
        ‘‘‘如果不是post请求,request.POST里面获取不到数据‘‘‘
        # 1、如果全部通过,把数据放clean_data里面发送请求
        # 2、如果不是全部通过,判断传过来的字段是否有没校验成功的
        # 3、如果有,则返回错误信息
        # 4、如果没有,则把key-value写到字典clean_data里面,发送请求
        # print(‘request.META‘,request.META) #请求端传过来的所有原始数据都在request.META里面
     # parse_file_upload是django用来解析body里面的数据和文件的   put_data, files = request.parse_file_upload(request.META, request)
        print(‘put_data‘, put_data)
        stu_form = StudentForm(put_data)  # 它校验的是全部的字段
        id = request.GET.get(‘id‘, 0)
        clean_data = {}
        if stu_form.is_valid():
            # stu_form.cleaned_data就是校验了的数据
            clean_data = stu_form.cleaned_data
        else:
            error_keys = set(stu_form.errors.get_json_data().keys())  # 校验没有通过的字段
            put_keys = set(put_data.keys())  # 这个传过来的字段
            if error_keys & put_keys:  #如果有交集,说明传过来的字段有没通过校验的
                data = {"error_code": -1, ‘msg‘: stu_form.errors.get_json_data()}
                return JsonResponse(data, json_dumps_params={"ensure_ascii": False})
            else:  #如果没有交集,则说明传过来的字段都通过校验了
                for k in put_keys:
                    clean_data[k] = put_data.get(k)
        Student.objects.filter(id=id).update(**clean_data)
        data = {"error_code": 0, ‘msg‘: "操作成功"}
        return JsonResponse(data, json_dumps_params={"ensure_ascii": False})

    def delete(self,request):
        id = request.GET.get(‘id‘,0)
        Student.objects.filter(id=id).delete()
        data = {"error_code": 0, ‘msg‘: ‘删除成功‘}
        return JsonResponse(data, json_dumps_params={"ensure_ascii": False})

原文地址:https://www.cnblogs.com/yanyan-/p/11782968.html

时间: 2024-07-30 07:54:34

十二、django之ModelForm数据校验的相关文章

二十一 Struts的数据校验两种方式:手动编码和xml校验

数据的校验: 一.前台校验:JS校验 JS的校验不是必须的,JS可以被绕行,可以提升用户体验 二.后台校验:编码校验 必须的校验 三.校验的方式: 手动编码(不建议使用) 配置文件(支持) 手动编码的校验方式: 继承ActionSupport,在这个类中写校验方式. 重写validate方法,validate方法在其他业务方法之前执行 针对某个方法校验,需要在方法名应为:validate+方法名,如validateAdd()   validateModify()  validateExecute

Django 【第二十二篇】ModelForm

一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信息 help_texts=None, # 帮助提示信息 widgets=None, # 自定义插件 error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERR

第十二章:Android数据存储(上)

一.SQLite介绍 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用.Android的数据库应用,依托于当下最流行的开源嵌入式数据库SQLite.在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内.从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用SQLite的接口来执行SQL语句,并通过JNI向上暴露Jav

易宝典——玩转O365中的EXO服务 之四十二 导出就地电子数据展示搜索结果

对于搜索结果,如果仅仅只能预览查看而不能提取,那么就无法将相关结果提供给第三方(如法院)作为证据或其它电子数据需求处理. 在Office 365的Exchange Online中,提供两种提取电子数据展示搜索结果的方案.分别是将就地电子数据展示搜索的结果复制到发现邮箱,以及将就地电子数据展示搜索的结果导出到PST文件. 一.复制就地电子数据展示搜索的结果到发现邮箱 在对搜索结果的数量和质量满意之后,可以将它们复制到发现邮箱.这一操作可以通过Exchange管理中心或PowerShell来完成.

十二 .Django 一对多表ForeighKey(ORM)

一 . 一对多表ForeighKey(ORM) 1.创建ORM表 https://www.cnblogs.com/dangrui0725/p/9615641.html 一对多:子表从母表中选出一条数据一一对应,但母表的这条数据还可以被其他子表数据选择 共同点是在admin中添加数据的话,都会出现一个select选框,但只能单选,因为不论一对一还是一对多,自己都是“一” class Colors(models.Model): colors=models.CharField(max_length=1

SpringBoot入门二十二,使用Validation进行参数校验

项目基本配置参考文章SpringBoot入门一,使用myEclipse新建一个SpringBoot项目,使用myEclipse新建一个SpringBoot项目即可,此示例springboot升级为2.2.1版本. 1. pom.xml添加aop支持 如果已经引用了spring-boot-starter-web,就不要需要引用spring-boot-starter-validation了,本例就不再引用 <!-- 引入validation支持 --> <dependency> <

Scrapy基础(十二)————异步导出Item数据到Mysql中

异步导出数据到Mysql中 上次说过从Item中同步写入数据库,因为网络的下载速度和数据库的I/O速度是不一样的所以有可能会发生下载快,但是写入数据库速度慢,造成线程的堵塞:关于堵塞和非堵塞,同步和异步的关系,因为没接触过,所以也不是很好的理解,这里查看了些资料,已做记录 链接1:https://www.zhihu.com/question/19732473;http://wiki.jikexueyuan.com/project/twisted-intro/ 实现异步写入mysql数据库的思路:

利用 Python 进行数据分析(十二)pandas:数据合并

pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法combine_first()方法:合并重叠数据. pandas.merge()方法:数据库风格的合并 例如,通过merge()方法将两个DataFrame合并: on='name'的意思是将name列当作键: 默认情况下,merge做的是内连接(inner),即键的交集. 其他方式还有左连接(lef

第十二章:汇总数据

@author: Tobin @date: 2019/10/28 22:32:57 聚集函数:运行在行组上,计算和返回单个值的函数. # AVG()函数,忽略值为NULL的行 SELECT AVG(prod_price) AS avg_price FROM products; # COUNT()函数 # COUNT(*),对行的数目进行计数,不管是否NULL # COUNT(column)对特定列中具有值的行进行计数,忽略NULL值 SELECT COUNT(*) AS num_cust FRO