gpt4 book ai didi

Django modelformset_factory 删除标记为删除的模型表单

转载 作者:行者123 更新时间:2023-12-04 11:28:32 25 4
gpt4 key购买 nike

使用 modelformset_factory 时,如何从数据库中删除在表单中标记为删除的对象?

我像这样创建我的 modelformset_factory:

ItemFormset = modelformset_factory(Item, ItemModelForm, extra=1, can_delete=True)
qset = Item.objects.filter(pr=pr)
formset = ItemFormset(queryset=qset)

当表单集在 POST 中返回时,我得到如下数据:
if request.method == "POST":
formset = ItemFormset(request.POST,queryset=qset)
if formset.is_valid():
marked_for_delete = formset.deleted_forms
instances = formset.save(commit=False)
for item in instances:
item.pr = pr
item.save()

当表单集返回时,我可以获得所有标记为删除的对象 formset.deleted_forms但我不知道如何实际删除它们。我试过遍历每一个并单独删除每一个,但我收到错误: Item object can't be deleted because its id attribute is set to None.
在模板中我包括 {{form.id}}所以每个对象都有在 POST 中传回的 ID。

调用后 instances = formset.save(commit=False)我可以打电话 formset.deleted_objects但它只是一个空列表: []
谁能看到我做错了什么会使对象不会从数据库中删除?

最佳答案

让你困惑的是formset.save(commit=False)不会做你认为它会做的事情。

虽然与 commit=False设置,编辑的对象不是 save() d、令人困惑的是,删除的对象被删除。

因此,当您遍历 marked_for_delete 时调用后 save(commit=False) ,你得到的对象已经被删除,因此 None为了他们的身份。

你的自我回答更好,更符合 Django 的习惯;一般来说,你应该调用 formset.save()并让它默认为 commit=True .事实证明commit=False这种情况相对罕见,并且没有使用,这可能是为什么没有人修复删除对象的(IMO,有问题的)行为的原因。

(顺便说一句,我只在非事务/自动提交数据库环境中观察到了这种行为;可能是因为 commit=False 和事务启用后,您在删除方面会获得更强大的行为。)

附言- 此行为已被 在 Django 1.7 中更改 :

"If you call formset.save(commit=False), objects will not be deleted automatically. You’ll need to call delete() on each of the formset.deleted_objects to actually delete them."

关于Django modelformset_factory 删除标记为删除的模型表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9573698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com