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方法
进行一个一个的值进行判断
- 首先被序列化的值是可序列化的,才能序列化,否则直接抛出异常.例如: 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来实现但是不能实现有date
和datetime
的值
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实现带有date
和datetime
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)