- 对于ajax来说,只能接收字符串,那么我们在后台的关键问题是,如何才能将我们要传入的数据序列化,使之成为ajax可以接收的数据类型呢?json模块是一个序列化的办法,然而json只能序列化python的三大数据类型,元组,列表,字典,对于其他的数据类型,json并不能为我们序列化,那么我们应该怎么办呢?
针对form组件来说,无非就是向后端传入2种数据,form类和error信息,form类不必多说,然而error信息是一个对象,并不属于三大数据类型,那么我们能否用json进行序列化,向后端发送呢?答案是可以的,因为obj.errors在django中已经为我们设置好了几种转换形式。
我们打印obj.errors的类型可以得到如下结果
<class 'django.forms.utils.ErrorDict'>
我们追溯这个ErrorDict这个类,
class ErrorDict(dict):
我们可以看到,这个类是继承于dict的(也就是字典),所以说,我们的obj.errors本质上也是一个字典类型,再往下看:
def as_data(self):
return {f: e.as_data() for f, e in self.items()}
def get_json_data(self, escape_html=False):
return {f: e.get_json_data(escape_html) for f, e in self.items()}
def as_json(self, escape_html=False):
return json.dumps(self.get_json_data(escape_html))
def as_ul(self):
if not self:
return ''
return format_html(
'<ul class="errorlist">{}</ul>',
format_html_join('', '<li>{}{}</li>', self.items())
)
def as_text(self):
output = []
for field, errors in self.items():
output.append('* %s' % field)
output.append('\n'.join(' * %s' % e for e in errors))
return '\n'.join(output)
def __str__(self):
return self.as_ul()
在源码中,这个类会自动给我们进行转换,将这个error当作其他类型进行reuturn,在__str__方法中,默认给我们返回的是作为<ul>
标签进行返回的,这就解释了,为什么之前我们在前端页面中调用{{ obj.errors }}时,返回的是一串<ul>
标签。所以我们可以直接用json序列化我们这个obj.errors。
2.django内置了一个模块,可以序列化queryset对象,我们用json模块并不能直接序列化QuerySet对象,这时候就要用到这个模块了。
from django.core import serializers
用到下面这个方法:
def serialize(format, queryset, **options):
"""
Serialize a queryset (or any iterator that returns database objects) using
a certain serializer.
"""
s = get_serializer(format)()
s.serialize(queryset, **options)
return s.getvalue()
我们需要传入需要序列化的数据类型,还有对象:
res = serializers.serialize('json',queryset)
这样就可以转换为json对象了
- 当然如果不知道这个模块,还有一个简单的办法进行序列化,我们可以直接将QuerySet对象转化那位列表:
list(QuerySet)
然后用json.dumps序列化这个列表,发送给前端之后,效果和上面的时一样的。