来自request.POST中多种形式的处理数据

时间:2019-01-16 11:42:42

标签: python django

在我的CreateViewUpdateView中,我正在使用一个用于主模型的表单和多个表单来直接创建/更新相关模型:

class MyModelCreateView(CreateView):
    model = MyModel
    form_class = MyModelForm

MyModelForm实例化了我在自身中提到的相关字段的必需格式。

我的问题是,当我序列化数据并将其发送到视图时,它不知道如何处理多余形式的数据。当我访问request.POST时,该数据将被丢弃。我正在序列化这样的表格:

let data = $('#main-form').serializeArray();
$('.other-form').each(function() {
    data.push({name: 'id-' + $(this).data('id'), value: $(this).serializeArray()});
});

这会将以下数组发送到服务器(我在这里对其进行了字符串化处理,以使其清晰显示):

[
  {
    "name": "name",
    "value": "some name"
  },
  {
    "name": "id-194",
    "value": [
      {
        "name": "prop1",
        "value": "on"
      },
      {
        "name": "prop2",
        "value": "some prop"
      },
      {
        "name": "prop3",
        "value": "other prop"
      }
    ]
  },
  {
    "name": "id-195",
    "value": [
      {
        "name": "prop2",
        "value": "some prop"
      },
      {
        "name": "prop3",
        "value": "other prop"
      }
    ]
  }
]

但是request.POST的内容如下:

<QueryDict: {u'name': [u'some name']}>

注意如何忽略所有其他数据。我可以通过以下方式将其发送到服务器:

let data = $('#main-form').serializeArray();
$('.other-form').each(function() {
    data.push({name: 'id-' + $(this).data('id'), value: $(this).serialize()});
});

但这会产生以下结果:

<QueryDict: {u'id-195': [u'prop1=on&prop2=some+prop&prop3=other+prop'], u'id-194': [u'displayable=on&prop2=some+prop&prop3=other+prop']}

当然不是我们想要的,因为我们得到的只是一个字符串,而不是准备好的数据。我们需要一个字典,我相信它可以适当地初始化表格。

这是我的ajax函数:

$.ajax({
    method: 'POST',
    url: editURL,
    data: data,
    success: function (html) {
        $('#mydiv').html(html);
    }
});

2 个答案:

答案 0 :(得分:0)

jQuery的serializeArray方法生成适合转换为JSON的数据结构。但是您还没有这样做,您正在尝试将其作为表单编码的数据发送。

您应该通过实际发送JSON并在另一端进行解析来简化它。

$.ajax({
    method: 'POST',
    url: editURL,
    data: JSON.stringify(data),
    contentType: 'application/json',
    success: function (html) {
        $('#mydiv').html(html);
    }
});

...

class MyModelCreateView(CreateView):
    model = MyModel
    form_class = MyModelForm
    def get_form_kwargs(self):
        return {'data': json.loads(request.body)}

注意,我不知道您要在表单中“实例化相关字段所需的表单”的方式,但这可能是错误的方法;您应该使用一个表单和一个与内联相关的表单集。虽然,由于这是Ajax发布到Django的,所以最好切换到Django REST Framework并为此使用序列化程序。它们可以轻松处理嵌套对象。

答案 1 :(得分:0)

您将要使用Formsets。如果页面上的表单都是相同的表单(即,您只是想一次或多次在同一模型中创建多个记录),您可能会发现formset_factory非常有用。