zoukankan      html  css  js  c++  java
  • Python自动化之ajax返回表单验证的错误信息和序列化扩展

    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)
    
  • 相关阅读:
    MySQL Server类型的MySQL 客户端的下载、安装和使用
    Sqoop学习笔记
    Sqoop安装部署
    Hive学习笔记
    HBase构架原理
    HBase HA分布式集群搭建
    IntelliJ IDEA(Community版本)本地模式的下载、安装及其使用
    Scala本地安装
    CALayer的隐式动画和显式动画
    简易动画两种执行方式
  • 原文地址:https://www.cnblogs.com/wspblog/p/6360141.html
Copyright © 2011-2022 走看看