在我的CreateView
和UpdateView
中,我正在使用一个用于主模型的表单和多个表单来直接创建/更新相关模型:
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);
}
});
答案 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
非常有用。