欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python自动化之ajax返回表单验证的错误信息和序列化扩展

程序员文章站 2022-05-24 10:45:48
...

form内置序列化错误

如果使用form提交数据的时候,可以直接返回错误信息到模板里面进行渲染
但是如果使用ajax处理呢

from django import forms
from django.forms import widgets, fields
class LoginForm(forms.Form):
    username = fields.CharField()
    password = fields.CharField(
        max_length=64,
        min_length=12
    )

def login(request):
    import json
    res = {'status':True, 'error':None, 'data': None}
    if request.method == "GET":
        return render(request,"login.html")
    elif request.method == "POST":
        obj = LoginForm(request.POST)
        if obj.is_valid():
            print(obj.cleand_data)
        else:
            # print(obj.errors, type(obj.errors))
            res['error'] = obj.errors.as_json()  # 转为json格式
            return HttpResponse(json.dumps(res))

这样需要在前端进行json.parse(arg)解析完之后还不行,因为obj.errors.as_json()所以还需要再次进行`json.parse(arg),这样就是在前端页面进行了两次json反序列化

另一种做法

json进行序列化的时候会调用default方法进行一个一个的值进行判断

  1. 首先被序列化的值是可序列化的,才能序列化,否则直接抛出异常.例如: ValidationError(['this field is required'])

所以我们就需处理这个ValidationError

import json
from django.core.exceptions import ValidationError
class JsonCustomEncoder(json.JSONEncoder):
    def default(self, field):
        if isinstance(field, ValidationError):
            return {'code':field.code, 'messages': field.messages}
        else:
            return json.JSONEncoder.default(self, field)

def login(request):
    res = {'status':True, 'error':None, 'data': None}
    if request.method == "GET":
        return render(request,"login.html")
    elif request.method == "POST":
        obj = LoginForm(request.POST)
        if obj.is_valid():
            print(obj.cleand_data)
        else:
            # print(obj.errors, type(obj.errors))
            # res['error'] = obj.errors.as_json()  # 转为json格式
            print(type(obj.errors.as_data()))
            for k,v in obj.errors.as_data().items():
                print(k,v)  # 这里v是ValidationError类型,不能序列化
            res['error'] = obj.errors.as_data()
        result = json.dumps(res, cls=JsonCustomEncoder)
        return HttpResponse(json.dumps(result))

这样的话在前端json.parse一次就行

django序列化操作

serializers

from django.core import serializers
 
ret = models.BookType.objects.all()
 
data = serializers.serialize("json", ret)

这是django提供的

通过json.dump来实现但是不能实现有datedatetime的值

import json
 
#ret = models.BookType.objects.all().values('caption')
ret = models.BookType.objects.all().values_list('caption')
 
ret=list(ret)
 
result = json.dumps(ret

通过json.dump实现带有datedatetime

import json 
from datetime import date 
from datetime import datetime 
   
class JsonCustomEncoder(json.JSONEncoder): 
    
    def default(self, field): 
     
        if isinstance(field, datetime): 
            return o.strftime('%Y-%m-%d %H:%M:%S') 
        elif isinstance(field, date): 
            return o.strftime('%Y-%m-%d') 
        else: 
            return json.JSONEncoder.default(self, field) 
   
   
# ds = json.dumps(d, cls=JsonCustomEncoder)