删除在表单集中删除的行集和重复问题

Delete rows set to be deleted in a formset and duplicates issues

我知道以前有人问过这个问题(例如 Django modelformset_factory delete modelforms marked for deletion) but I've tried all the possible solutions, including doing what the official documentation says (https://docs.djangoproject.com/en/3.0/topics/forms/formsets/),但我仍然无法从我的表单集中删除表单。

我有一个表单可以正确发送 POST 数据以及我需要的一切(包括 DELETE 指令)。

[print(form_links_event.cleaned_data) for form in form_links_event.deleted_forms]
[{'description': 'asdasd', 'link': 'http://www.test.com', 'id': <linksEvent: linksEvent object (25)>, 'DELETE': True}

然而,我需要在保存所有实例之前处理表单集(我需要附加相关模型的id),所以我需要调用save(commit=False):

    instances_links_event = form_links_event.save(commit=False)
    for link in instances_links_event:
            link.event = instance_event
            link.save()
        form_event.save()
        form_links_event.save()

不过,这样做会删除 .deleted_forms 列表。事实上:

[print(instances_links_event.cleaned_data) for form in instances_links_event.deleted_forms]
AttributeError: 'list' object has no attribute 'deleted_forms'

因此我陷入了一个循环:我无法直接保存我的表单,因为我需要先将更多数据附加到它,并且在其原始状态下它有 'deleted_forms' 列表。但是,一旦我使用 commit=False 保存它并进行处理,'deleted_forms' 就不再存在,因此我无法删除那些设置为删除的行。理想情况下,我想这样做:

instances_links_event = form_links_event.save(commit=False)

        for link in instances_links_event:
            if (link.delete = True):
                link.delete()
            link.event = instance_event
            link.save()
        form_links_event.save()

我正在使用 Django 3.0.6 和 Python 3.7.

更新

即使没有 commit=False,使用 form_links_event.save() 保存表单,我仍然遇到问题:当我在我的 'edit page'(即绑定表单)中保存表单时 save() 保存现有记录,即使我没有编辑任何东西,这意味着我最终得到了很多重复项。 Django formset 有问题还是只有我?

我的表格:

<tbody id='linksEvent_body'>
      {% for formLink in form_links_event.forms %}
          {{formLink.non_field_errors}}
          {{formLink.errors}}

          <trclass="formLink">
              {{ formLink.id }}
              <td>{{formLink.link}}</td>
              <td>{{formLink.description}}{{formLink.DELETE}}</td>
            </tr>

    {% endfor %}
</tbody>

我一直在与此作斗争并连续工作了好几天,尝试了各种可能的参数和代码。我发现保存后第一次表单是 loaded/bound 时,它没有正确加载 form_management 数据(即 -INITIAL 值不正确并且 extra 空白表格不存在)并且绑定数据并不总是更新。如果我尝试通过 JavaScript 修复它,例如计算显示的表单数量并将该数字放入 -CURRENT 参数并将该数字 -1 放入 -INITIAL 或类似的东西, Django 不会喜欢它(文档本身说无论如何都不鼓励篡改表单管理数据,我理解这一点)。一旦我手动刷新页面(通过将光标放在地址栏上并按回车键,而不是按 ctrl/cmd + R,这会要求我发送 POST 数据再次),然后表单会正确加载,任何进一步的编辑都会很好地正确保存。所以,我能找到解决这个问题的唯一方法是将这段代码放在包含以下形式的页面中:

<script type='text/javascript'>

(function()
{
  if( window.localStorage )
  {
    if( !localStorage.getItem('firstLoad') )
    {
      localStorage['firstLoad'] = true;
      window.location=window.location;;
    }
    else
      localStorage.removeItem('firstLoad');
  }
})();

</script>

有了这段代码,一切都运行良好。我希望这会帮助像我一样面临这个令人沮丧的问题的其他人。

PS:问题与commit=False指令无关。是的,我在 view.

中声明了 @never_cache