python - 从 Django 表单集中删除表单

标签 python django django-forms

我正在尝试实现一个 Django 表单集(用户可以在表单集中动态添加/删除表单)。

我使用 JS 添加新行(使用 empty_form):

    $("#add-item").click(function(e){
        e.preventDefault();
        var count = parseInt($('#id_form-TOTAL_FORMS').val());
        $('.invoice-items').append($('#empty_invoice_item').html().replace(/__prefix__/g, count));
        $('#id_form-TOTAL_FORMS').attr('value', count+1);
        $(".invoice-items .invoice-item .col-lg-9 .form-group:last-child").last().append('<a href="#" class="delete-item"><i class="glyphicon glyphicon-remove"></i></a>')
    });

我还使用 JS 在特定表单上设置 DELETE 标志。一切都传递给 View 。

我的 View (部分)代码:

invoice_form = InvoiceForm()
invoice_item_helper = InvoiceItemHelper
InvoiceItemFormset = formset_factory(InvoiceItemForm, extra=0, max_num=15, validate_max=True, min_num=1, validate_min=True, can_delete=True)
formset = InvoiceItemFormset()

if request.method == 'POST':
    invoice_form = InvoiceForm(request.POST)
    formset = InvoiceItemFormset(request.POST)

问题是,django 总是显示表单集中的所有表单,甚至是标记为删除的表单。因此,即使我的发票表格有问题并且无法验证,它也会显示带有错误消息的发票表格和所有表格(再次)。

如何完全删除在 if request.method == 'POST': block 中标记为删除的表单?可能吗?

最佳答案

这取决于您如何呈现表单,但您可以检查该字段 form.DELETE在模板中,如果已设置,则隐藏该表单以供显示,并且数据将一直传递直到处理数据(当所有其他表单都有效时)。它还将确保表单集的表单前缀和索引完好无损。

当一个表单集被验证时,它将忽略标记为删除的表单。 formset.is_valid

您还可以使用 deleted_forms 在 View 中选择删除了哪些表单并可能处理它们,但您仍然必须重建整个表单集而无需删除表单以维护索引和表单数量。 我个人发现这样做很复杂并且会导致复杂的代码。

关于python - 从 Django 表单集中删除表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31849379/

相关文章:

python - 如何在 Django 外部设置 ModelForm 中的字段?

python - 按日期对 Python 对象列表进行排序(当有些为 None 时)

python - 在 python Blender (bpy) 中列出每个面的顶点

javascript - 如何让不喜欢按钮在喜欢后立即显示,反之亦然?在 Django 中

django - 如何在 JSONField 上使用 django-filter

python - Django一对多表单

python - struct.unpack 和 win/lin 中 python 2.4 和 2.4.4 的问题

python - 使用 reshape 时,“numpy.ndarray”对象没有属性 'values'

Django 管理文件上传不起作用,我该如何调试?

python - Python中使用正则表达式进行批量替换