十django之ModelForm数据校验
Posted yanyan-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十django之ModelForm数据校验相关的知识,希望对你有一定的参考价值。
以下例子对数据库表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数据校验的主要内容,如果未能解决你的问题,请参考以下文章