首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用inline_formsety在模型/表单上的clean()函数中排除已删除的对象

在模型/表单的clean()函数中排除已删除的对象,可以通过使用inline_formset来实现。inline_formset是Django中的一个工具,用于处理嵌套在父模型/表单中的子模型/表单。在使用inline_formset时,我们可以通过重写clean()函数来实现排除已删除的对象。

下面是一个示例,展示如何使用inline_formset在模型/表单的clean()函数中排除已删除的对象:

  1. 导入必要的模块和类:
代码语言:txt
复制
from django.forms import inlineformset_factory
from django.core.exceptions import ValidationError
  1. 定义父模型/表单和子模型/表单:
代码语言:txt
复制
class ParentModel(models.Model):
    # 父模型字段

class ChildModel(models.Model):
    parent = models.ForeignKey(ParentModel, on_delete=models.CASCADE)
    # 子模型字段

class ChildForm(forms.ModelForm):
    class Meta:
        model = ChildModel
        fields = '__all__'
  1. 创建inline_formset:
代码语言:txt
复制
ChildFormSet = inlineformset_factory(ParentModel, ChildModel, form=ChildForm, extra=1)
  1. 在父模型/表单的clean()函数中使用inline_formset:
代码语言:txt
复制
class ParentForm(forms.ModelForm):
    class Meta:
        model = ParentModel
        fields = '__all__'

    def clean(self):
        cleaned_data = super().clean()
        child_formset = ChildFormSet(self.instance, self.data, self.files)

        if not child_formset.is_valid():
            raise ValidationError('子表单数据无效')

        # 排除已删除的子对象
        if self.instance.pk:
            deleted_child_ids = set(self.instance.childmodel_set.values_list('id', flat=True)) - set(child_formset.cleaned_data)
            ChildModel.objects.filter(id__in=deleted_child_ids).delete()

        return cleaned_data

在上述代码中,我们首先通过调用inlineformset_factory函数创建了一个inline_formset,指定了父模型ParentModel和子模型ChildModel,并使用ChildForm作为子表单的形式。

然后,在父模型/表单的clean()函数中,我们通过实例化ChildFormSet并传递父模型实例self.instance、请求数据self.data和文件self.files来创建child_formset对象。我们检查child_formset是否有效,如果无效,则抛出ValidationError。

接下来,我们通过比较子表单中的数据与已保存的子对象的id,确定哪些子对象被删除了。然后,我们使用ChildModel.objects.filter(id__in=deleted_child_ids).delete()来删除这些子对象。

最后,我们返回父模型/表单的cleaned_data。

这样,我们就在模型/表单的clean()函数中成功排除了已删除的对象。

关于推荐的腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体品牌商,我无法直接给出链接,但您可以通过腾讯云官方网站或搜索引擎搜索相关产品以获取详细信息。

相关搜索:如何使用我在模型中定义的函数验证ruby rails中的表单如何使用jquery在DOM中获取对象上的函数?在表单上的自定义验证器中的valueChanges上的“ObjectUnsubscribedError对象已取消订阅”如何使postgres SQL函数使用已删除行中的值?如何知道在laravel中给定模型上的关系是否已更新?如何在Forge Viewer中删除或隐藏模型树面板上的对象?如何使用ng change在表单中形成已更改值的数组如何使用复选框通过嵌套表单修改模型中每个对象的值如何使用javascript动态删除在html中创建的输入表单在使用页面对象模型的Protractor测试中需要断言表单字段如何将现有表单中已删除的内容显示到一个完全独立的url中,该url在django中显示已删除的项目。如何使用Vuejs在Safari中侦听表单上的粘贴事件我不知道如何使用SnackBar Undo在Firestore上恢复已删除的文档如何仅当对象存在时才在Django模型表单中添加额外的字段?当使用react- test -library在表单中提交时,如何测试已调用的函数?如何重新加载已保存的模型(使用图形?)在未来的测试数据上创建相同的结果?Django Forms:如何使用现有模型中的值在表单中创建简单的下拉列表如何使用Typescript泛型来构造可以在类似对象上使用的函数?如何使用gradle在grails脚本上删除目录中的文件如何使用jquery从asp.net视图模型中动态删除行,而不删除集合中其余的后续对象
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 领券