【问题标题】:Delete rows set to be deleted in a formset and duplicates issues删除设置为在表单集中删除的行并重复问题
【发布时间】:2020-08-30 00:04:56
【问题描述】:

我知道之前有人问过这个问题(例如Django modelformset_factory delete modelforms marked for deletion),但我已经尝试了所有可能的解决方案,包括按照官方文档所说的(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}

但是,我需要在保存所有实例之前处理formset(我需要附加相关模型的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() 保存表单,我仍然遇到问题:当我将表单保存在我的“编辑页面”(即绑定表单)中时,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>

【问题讨论】:

    标签: django django-forms django-views formset


    【解决方案1】:

    我一直在努力解决这个问题,并连续工作了好几天,尝试了各种可能的参数和代码。我发现在保存表单后第一次加载/绑定表单时,它没有正确加载 form_management 数据(即-INITIAL 值不正确,extra 空白表单不存在)以及绑定数据并不总是更新。如果我尝试通过 JavaScript 修复它,例如计算显示的表单数量并将该数字放入 -CURRENT 参数中并将该数字 -1 放入 -INITIAL 或类似的东西,Django 不会喜欢它(文档本身说不鼓励篡改表单管理数据,我理解)。一旦我手动刷新页面(通过将光标放在地址栏上并按 Enter,而不是按 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

    【讨论】:

      猜你喜欢
      • 2020-08-08
      • 2013-07-26
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      相关资源
      最近更新 更多