【问题标题】:Django child model data not saving with Ajax raising ValueError: Data didn't validateDjango 子模型数据未通过 Ajax 引发 ValueError 保存:数据未验证
【发布时间】: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 是子模型mappedTargFieldsprimary_keymapper_header 是子模型中指向父表mappedTargModel的字段。
  • 我们有验证错误,但没有包含任何表单或模型。

标签: python django


【解决方案1】:

您检查该表单is_valid,但不检查该表单集is_valid

if qs_targ_model_form.is_valid():
            qs_targ_model_form.save()
            target_field_formset = CreateMappedTargFieldsFormset(request.POST, instance=qs_targ_model_form, prefix='')
            if target_field_formset.is_valid():
               target_field_formset.save()
               msg='Data saved!!!'
               return JsonResponse(msg, safe=False)
            else:
               msg = 'Formset is not valid'
        else:
            msg= 'Error occured in save!'

【讨论】:

  • 您在谈论错误捕获。手头的问题呢?
  • 你有错误错误:ValueError:无法创建mappedTargFields,因为数据没有验证。。它说你试图保存表单集而不验证它。我向您展示了我在保存之前验证表单集的代码
  • 这个错误是关于一个固有问题,尽管表单集中所有强制性数据都存在,但数据验证没有发生。您所做的只是错误捕获。这并不能解决问题。它在我的代码中的其他地方。
  • target_field_formset = CreateMappedTargFieldsFormset(request.POST, instance=qs_targ_model_form, prefix='') target_field_formset.save() 您创建表单集,然后尝试保存它。你不能在不验证的情况下做到这一点。只需在它们之间添加一行target_field_formset.is_valid()
  • 验证什么?没有什么可以验证的。所有字段值都是字符串。所有必填字段均已填写。
猜你喜欢
  • 1970-01-01
  • 2020-07-11
  • 2023-03-28
  • 2012-08-25
  • 2021-06-28
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多