【发布时间】: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