【发布时间】:2020-06-29 14:47:50
【问题描述】:
我正在尝试使用 Ajax 在我的 Django 应用程序中的一对相关模型中保存数据。虽然保存了父表数据,但我无法在子模型中保存数据。系统发出以下错误信息:
错误: ValueError: The mappedTargFields could not be created because the data didn't validate.
如何在子表中保存数据?即使进行了广泛的搜索,我也找不到保存内联表单集数据的解决方案(我通常使用 CBV + 管理表单)。还是不能使用 jQuery/Ajax 保存表单集数据?
以下是相关代码:
views.py
>def SaveMapAjax(request, object_id=False):
if request.method == 'POST' and request.is_ajax():
qs_targ_model_form = mappedTargModelForm(request.POST)
target_field_formset = CreateMappedTargFieldsFormset(request.POST)
if qs_targ_model_form.is_valid():
qs_targ_model_form.save()
target_field_formset = CreateMappedTargFieldsFormset(request.POST, instance=qs_targ_model_form, prefix='')
target_field_formset.save()
msg='Data saved!!!'
return JsonResponse(msg, safe=False)
else:
msg= 'Error occured in save!'
else:
qs_targ_model_form = mappedTargModelForm()
target_field_formset = CreateMappedTargFieldsFormset(instance=qs_targ_model_form)
return JsonResponse(msg, safe=False)
表单集
CreateMappedTargFieldsFormset = inlineformset_factory(
mappedTargModel, # Parent table
mappedTargFields, # Child table
form=mappedTargFieldsForm, # Modelform on Child table
extra=2,
can_delete=False, min_num=1, validate_min=True)
模板
<!--html-->
<form action="" method="POST" class="form" id="dataMapperForm">
{% csrf_token %}
{{ target_model_form.as_p }}
<div class="col-md-12 text-nowrap" style="font-family:'Courier New'">
{{ target_field_formset.management_form }}
</div>
</form>
<!--The ajax part-->
<script>
$(function() {
$('#dataMapperForm').on('submit', function(e) {
var frm = $('#dataMapperForm');
e.preventDefault();
$.ajax({
type: 'POST',
url: '{% url 'save_mapper' %}',
data: frm.serialize(),
success: function(data) {
console.log('Success!!');
$("#dataMapperForm")[0].reset();
},
error: function(data) {
console.log('Error');
},
});
});
});
</script>
编辑:
以下是它在target_field_formset.errors 上抛出的错误:
[{'mapper_item': ['Select a valid choice. That choice is not one of the available choices.'], 'mapper_header': ['The inline value did not match the parent instance.']}, {'mapper_item': ['Select a valid choice. That choice is not one of the available choices.'], 'mapper_header': ['The inline value did not match the parent instance.']}, {'mapper_item': ['Select a valid choice. That choice is not one of the available choices.'], 'mapper_header': ['The inline value did not match the parent instance.']}]
编辑2:
在将序列化数据打印到控制台时,我得到以下信息:
&mapper_doc_type=MAPPER // Parent model field
&mapper_name=Test // Parent model field
&mapper_target_model=employee // Parent model field
&mapper_hdr_tab-TOTAL_FORMS=3
&mapper_hdr_tab-INITIAL_FORMS=0
&mapper_hdr_tab-MIN_NUM_FORMS=1
&mapper_hdr_tab-MAX_NUM_FORMS=1000
&mapper_hdr_tab-0-mapper_item=name // Child model "pk"
&mapper_hdr_tab-0-mapper_header=name // Child model "fk" field
&mapper_hdr_tab-0-mapped_field=name // Child model field
&mapper_hdr_tab-0-mapped_field_col_name=NAME
在我看来,mapper_item 的赋值应该是一个整数,而不是上面显示的name。对于下一项 mapper_header 类似,它应该是父表的主键,而不是 name。
我在这里做的事情是非常错误的。
【问题讨论】:
-
@Andrey Maslov - 我已将错误添加为 edit。您可以在我的问题下添加您的 cmets,以防万一。这里
mapper_item是子模型mappedTargFields 的primary_key。mapper_header是子模型中指向父表mappedTargModel的字段。 -
我们有验证错误,但没有包含任何表单或模型。