在 Django 中传递 json 并反序列化表单
Pass json and deserialize form in django
接下来的问题是:我用 ajax 发送了一些 post 数据到服务器。此数据如下所示:
data = {
form : $(this).serialize(),
some_array: [2,3,4,1]
}
如何在django中获取表单对象? request.POST['form']
returns 一个带表格的字符串。我正在尝试使用 import json
库。
但是,当我 运行
value = json.load(request.POST['some_array'])
或
form = json.load(request.POST['form'])
没用。
正在打印 request.POST['form']
returns 以下内容:
u'csrfmiddlewaretoken=I3LWAjfhZRGyd5NS3m9XcJkfklxNhxOR& address_city=%D0%9A%D0%B8%D1%97%D0%B2& address_street=2& address_building=3& delivery_time=2015-05-15'
表单数据未在 JSON 中编码,而是作为查询字符串编码。
您可以使用标准库中的 urlparse.parse_qs
来解析该查询字符串。
示例:
from urlparse import parse_qs
form_data = parse_qs(request.POST['form'].encode('ASCII')) # Query strings use only ASCII code points so it is safe.
# To access address_city:
address_city = form_data['address_city'][0].decode('utf-8')
# If you plan to pass form_data to a Django Form,
# use QueryDict instead of parse_qs:
from django.http import QueryDict
form_data = QueryDict(request.POST['form'].encode('ASCII'))
解决方案 1
替代 aumo 的答案,假设您使用的是 jQuery,您实际上可能想使用 .serializeArray()
instead of .serialize()
, to generate a JSON object that you can then JSON.stringify 和 POST。
data = {
form : $(this).serializeArray(),
some_array: [2,3,4,1]
};
$.ajax(url, {
data: JSON.stringify(data),
contentType: 'application/json',
type: 'POST',
});
正如您在评论中指出的那样,serializeArray
JSON 输出的格式不容易被 Django 表单使用,需要进一步处理,在通过 [=19 反序列化内容后=].
data = json.load(request)
value = data['some_array']
form_data = {}
for f in data['form']:
if f not in form_data:
form_data[f['name']] = f['value']
elif not isinstance(form_data[f['name']], list):
form_data[f['name']] = [form_data[f['name']], f['value']]
else:
form_data[f['name']].append(f['value'])
form = MyForm(data=form_data)
解决方案 2
再看一遍代码后,在前端将表单数据序列化为正确的 json 格式可能会更好(为了将来的安全也更通用)。
虽然有很多解决办法;我最好的选择是使用 tried/popular 库,例如 jquery-serialize-object,代码更改很小:
<script src="jquery.serialize-object.min.js"></script>
<script>
data = {
form : $(this).serializeObject(),
some_array: [2,3,4,1]
};
$.ajax(url, {
data : JSON.stringify(data),
contentType : 'application/json',
type : 'POST',
});
</script>
然后服务器代码就简单多了
data = json.load(request)
value = data['some_array']
form = MyForm(data=data['form'])
接下来的问题是:我用 ajax 发送了一些 post 数据到服务器。此数据如下所示:
data = {
form : $(this).serialize(),
some_array: [2,3,4,1]
}
如何在django中获取表单对象? request.POST['form']
returns 一个带表格的字符串。我正在尝试使用 import json
库。
但是,当我 运行
value = json.load(request.POST['some_array'])
或
form = json.load(request.POST['form'])
没用。
正在打印 request.POST['form']
returns 以下内容:
u'csrfmiddlewaretoken=I3LWAjfhZRGyd5NS3m9XcJkfklxNhxOR& address_city=%D0%9A%D0%B8%D1%97%D0%B2& address_street=2& address_building=3& delivery_time=2015-05-15'
表单数据未在 JSON 中编码,而是作为查询字符串编码。
您可以使用标准库中的 urlparse.parse_qs
来解析该查询字符串。
示例:
from urlparse import parse_qs
form_data = parse_qs(request.POST['form'].encode('ASCII')) # Query strings use only ASCII code points so it is safe.
# To access address_city:
address_city = form_data['address_city'][0].decode('utf-8')
# If you plan to pass form_data to a Django Form,
# use QueryDict instead of parse_qs:
from django.http import QueryDict
form_data = QueryDict(request.POST['form'].encode('ASCII'))
解决方案 1
替代 aumo 的答案,假设您使用的是 jQuery,您实际上可能想使用 .serializeArray()
instead of .serialize()
, to generate a JSON object that you can then JSON.stringify 和 POST。
data = {
form : $(this).serializeArray(),
some_array: [2,3,4,1]
};
$.ajax(url, {
data: JSON.stringify(data),
contentType: 'application/json',
type: 'POST',
});
正如您在评论中指出的那样,serializeArray
JSON 输出的格式不容易被 Django 表单使用,需要进一步处理,在通过 [=19 反序列化内容后=].
data = json.load(request)
value = data['some_array']
form_data = {}
for f in data['form']:
if f not in form_data:
form_data[f['name']] = f['value']
elif not isinstance(form_data[f['name']], list):
form_data[f['name']] = [form_data[f['name']], f['value']]
else:
form_data[f['name']].append(f['value'])
form = MyForm(data=form_data)
解决方案 2
再看一遍代码后,在前端将表单数据序列化为正确的 json 格式可能会更好(为了将来的安全也更通用)。
虽然有很多解决办法;我最好的选择是使用 tried/popular 库,例如 jquery-serialize-object,代码更改很小:
<script src="jquery.serialize-object.min.js"></script>
<script>
data = {
form : $(this).serializeObject(),
some_array: [2,3,4,1]
};
$.ajax(url, {
data : JSON.stringify(data),
contentType : 'application/json',
type : 'POST',
});
</script>
然后服务器代码就简单多了
data = json.load(request)
value = data['some_array']
form = MyForm(data=data['form'])