Django modelformset_factory删除标记为删除的模型 [英] Django modelformset_factory delete modelforms marked for deletion

查看:57
本文介绍了Django modelformset_factory删除标记为删除的模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

When using modelformset_factory how do you delete objects from the database that get marked for delete in the form?

我这样创建我的modelformset_factory:

I create my modelformset_factory like this:

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

当表单集返回POST时,我得到的数据如下:

When the formset comes back in the POST I get the data like so:

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对象无法删除,因为其id属性设置为None.

When the formset comes back I can get all of the objects marked for delete with formset.deleted_forms but I can't figure out how to actually delete them. I've tried looping through each one and deleting each one individually but I get the error: Item object can't be deleted because its id attribute is set to None.

在模板中,我包括了 {{form.id}} ,因此每个对象都有其ID,该ID将在POST中传递回去.

In the template I'm including {{form.id}} so each object has it's ID being passed back in the POST.

在调用 instances = formset.save(commit = False)后,我可以调用 formset.deleted_objects ,但这只是一个空列表: []

After calling instances = formset.save(commit=False) I can call formset.deleted_objects but it's just an empty list: []

任何人都可以看到我在做错什么,这会使这些对象无法从数据库中删除吗?

Can anyone see what I'm doing wrong that would make the objects not get deleted from the database?

推荐答案

通过在ItemModelForm中包含Item模型中的所有字段,我能够调用 formset.save()和所有模型在表单中标记为删除的模型将被删除,所有修改或添加的模型都将被更新或保存.我将字段"pr"(外键)作为HiddenInput包含在内,并通过扩展ItemModelForm对其进行初始化,如下所示:

By including all of the fields from the Item model in the ItemModelForm I was able to call formset.save() and all models marked for delete in the form get deleted and any models that were modified or added get updated or saved. I include the field 'pr' (a foreign key) as a HiddenInput and initialize it by extending ItemModelForm like so:

class EnhancedItemForm(ItemModelForm):
    def __init__(self, *args, **kwargs):
        super(EnhancedItemForm, self).__init__(*args, **kwargs)
        self.fields['pr'].widget = forms.HiddenInput()
        self.fields['pr'].initial = pr
ItemFormset = modelformset_factory(Item, EnhancedItemForm, extra=extra_forms, can_delete=True)
formset = ItemFormset(queryset=qset)

然后我就可以这样处理帖子:

Then I was able to handle the post like this:

if request.method=="POST":
    formset = ItemFormset(request.POST)
    if formset.is_valid():
        # Save, delete, update ..everything you need in one command:
        instances = formset.save()

        for instance in instances:
            # Make sure the assigned pr hasn't changed
            if instance.pr != pr:
                instance.pr = pr 
                instance.save()

由于modelformset_factory接受ModelForm类而不是Modelform的实例,因此我不得不在视图中扩展ItemModelForm,在该视图中我知道我想将pr初始化为什么.

Since modelformset_factory accepts a ModelForm class and not an instance of a modelform I had to extend ItemModelForm in the view where I know what I want the pr to be initialized to.

这篇关于Django modelformset_factory删除标记为删除的模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆