覆盖 Django 管理内联表单集不会保存超过 1 行

Overriding Django admin inlines formset will not save more than 1 row

我有一个带内联的直接 admin.ModelAdmin class,其中我用 forms.Model 和 BaseInlineFormset 覆盖表单和表单集以添加自定义字段。我有一个加载的自定义 jQuery 脚本,每当从 select2 下拉列表中选择一台机器时,它都会对 REST API 运行一个 AJAX 查询,并根据外键值并使用信息填充 CleaningEntryInline。但是,保存后它只是 post 将一条记录写入数据库。

class CleaningEntryInline(admin.TabularInline):
    model = CleaningEntry
    form = CleaningEntryForm
    formset = CleaningEntryFormSet
    extra = 0
    raw_id_fields = ['cleaning_item']

    fieldsets = [
        (None,{'fields':[('cleaning_item','cleaning_action', 'checked', 'na', 'notes')]})
    ]
    template = 'admin/quality/cleaningentry/edit_inline/tabular_actions.html'

class CleaningLogAdmin(admin.ModelAdmin):
    ####Save model function override to make and save QC Lab user and make uneditable.
    def save_model(self, request, obj, form, change): 
        obj.lab_user = request.user.username
        obj.save()

    list_display = ['machine_used','get_product_info','lot_num','start_time','lab_user']
    list_filter = ['machine_used']
    readonly_fields = ['lab_user', 'cleaning_users']
    search_fields = ['machine_cleaned', 'lot_num', 'recipe_cleaned__recipe_name__item_code', 'lab_user']
    autocomplete_fields = ['machine_used','recipe_cleaned']
    fieldsets = [
        ('Cleaning Info',{'fields':[('machine_used', 'recipe_cleaned', 'lot_num')]}),   
        (None,{'fields':[('start_time')]}),
        (None,{'fields':[('clean_time', 'lab_user')]})
    ]
    inlines = [CleaningUserInline, CleaningEntryInline]

    change_list_template = 'admin/quality/cleaninglog/change_list.html'
    list_per_page = 25
    form = CleaningEntryForm

    class Media:
        js = (
            'admin/js/vendor/jquery/jquery.min.js',
            'admin/js/jquery.init.js',
            'admin/js/list_filter_collaspe.js',
            'admin/js/equipaction_filter.js',
        )
        css = {'all':(
            'admin/css/vendor/select2/select2.css',
            )
        }

我试过重写 but I'm not entirely sure this is a Django issue and wondering if it's not due to ?

如果我在 ajax 调用后使用 "Add another" 按钮手动追加行,然后单击 "Save and Continue" 或 "Save" 并选中 POST表单正在提交所有内联,但它只保存列出的第一条记录和我手动添加的所有记录。

我的equipaction_filter.js:

$(document).ready(function () {
    ////Row container to append to table...
    row_container = $(
        '<tr class="form-row dynamic-log_entry row1" id="log_entry-0">'+
        '<td class="original"><input type="hidden" name="log_entry-0-id" id="id_log_entry-0-id">'+
        '<input type="hidden" name="log_entry-0-log_entry" id="id_log_entry-0-log_entry"></td>'+
        '<td class="field-cleaning_item"><input type="text" name="log_entry-0-cleaning_item" class="vForeignKeyRawIdAdminField" id="id_log_entry-0-cleaning_item">'+
        '<a href="/admin/quality/equipmentaction/?_to_field=id" class="related-lookup" id="lookup_id_log_entry-0-cleaning_item" title="Lookup"></a></td>'+
        '<td class="field-cleaning_action"><input type="text" name="log_entry-0-cleaning_action" disabled="" id="id_log_entry-0-cleaning_action" style="width: 200px;"></td>'+
        '<td class="field-checked"><input type="checkbox" name="log_entry-0-checked" id="id_log_entry-0-checked"></td>'+
        '<td class="field-na"><input type="checkbox" name="log_entry-0-na" id="id_log_entry-0-na"></td>'+
        '<td class="field-notes"><input type="text" name="log_entry-0-notes" maxlength="512" id="id_log_entry-0-notes" class="vTextField"></td>'+
        '<td class="delete"></td></tr>'
    );

    //// This binds an ".on(select)" event function to the select2 box for the machine_used that
    //// preforms an AJAX call using the machine_fk reference id to get all the EquipmentActions
    //// records for that machine using REST API.
    $("select#id_machine_used").on("select2:select", function(event) {
        machine_fk = event.params.data.id;
        var origin = window.location.origin;
        $.ajax({
        url:origin+'/pyscales/v1/quality/?machine_fk='+machine_fk,
        crossDomain:true,
        dataType:'json',
        contentType: 'application/json',
        //Upon a successful GET request, data is returned in JSON form.
        success: function(data) {
            console.log(data);
            $("#id_log_entry-TOTAL_FORMS").val(data.count);
            $(data.results).each(function (i, item) {
                // console.log(i, item);
                new_row = $(row_container[0].outerHTML.replace(/log_entry-0/,'log_entry-'+i));
                new_row[0].children[1].children[0].value = item.id;
                new_row[0].children[2].children[0].value = item.machine_fk+' | '+item.action;
                var new_table = $('table.cleaning-table');
                new_table.find('tbody').prepend(new_row);
                });
            }
        });
    });
});
})(django.jQuery);

我希望得到一些反馈或建设性的批评。我对 jQuery 还是个新手,我很难理解它的来龙去脉。如果我需要 post 其他东西,请告诉我。提前致谢。

再次检查代码并查看 POST 数据后,根据@dirkgroten 的请求,我注意到在 POST 上,我使用的 .replace() 正则表达式没有正确映射表格的索引:

new_row = $(row_container[0].outerHTML.replace(/log_entry-0/,'log_entry-'+i));

应该是:

new_row = $(row_container[0].outerHTML.replace(/log_entry-0/gi,'log_entry-'+i));

当页面映射数据而不是内联中每一行的记录时,如下所示:

log_entry-0-cleaning_item:1
log_entry-1-cleaning_item:2
log_entry-2-cleaning_item:3

它正在将多个值映射到 jQuery 正在创建的同一个内联对象:

log_entry-0-cleaning_item: 
[0]:1
[0]:2
[0]:3