码迷,mamicode.com
首页 > 其他好文 > 详细

十二、django之ModelForm数据校验

时间:2019-11-02 17:44:44      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:sci   手机号   rms   ble   core   字典   16px   post方法   lte   

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

#models.py
class
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})

 

十二、django之ModelForm数据校验

标签:sci   手机号   rms   ble   core   字典   16px   post方法   lte   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!