4

下一个问题是:我将一些带有 ajax 的发布数据发送到服务器。此数据如下所示:

data = {
  form : $(this).serialize(),
  some_array: [2,3,4,1]
}

如何在 django 中获取表单对象?request.POST['form']返回带有表单的字符串。我正在尝试使用import json库。

但是,当我运行 value = json.load(request.POST['some_array'])form = json.load(request.POST['form']) 它不起作用时。

打印request.POST['form']返回以下内容:

u'csrfmiddlewaretoken=I3LWAjfhZRGyd5NS3m9XcJkfklxNhxOR& address_city=%D0%9A%D0%B8%D1%97%D0%B2& address_street=2& address_building=3& delivery_time=2015-05-15'

4

2 回答 2

8

表单数据不是用 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'))
于 2015-04-29T14:25:49.880 回答
0

解决方案 1

或者 aumo 的答案,假设您使用的是 jQuery,您实际上可能想要使用.serializeArray()而不是.serialize(), 来生成一个 JSON 对象,然后您可以使用 JSON.stringify和 POST。

data = {
  form : $(this).serializeArray(),
  some_array: [2,3,4,1]
};

$.ajax(url, {
  data: JSON.stringify(data),
  contentType: 'application/json',
  type: 'POST',
});

正如您在评论中指出的那样,serializeArrayJSON 输出的格式不容易被 Django 表单使用,并且需要在通过json.load.

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 格式可能会更好(并且为了未来的安全性更通用)。

尽管对此有很多解决方案;我最好的选择是使用久经考验/流行的库,例如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'])
于 2015-04-30T07:23:16.187 回答