Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何覆盖admin表单集中的删除行为_Django_Django Forms_Django Admin - Fatal编程技术网

Django 如何覆盖admin表单集中的删除行为

Django 如何覆盖admin表单集中的删除行为,django,django-forms,django-admin,Django,Django Forms,Django Admin,情景: 我有这样的模型: class A(models.Model): ... class B(models.Model): a = models.ForeignKey(A) ... class AInlinde(admin.StackedInline): ... model = A ... class BAdmin(admin.ModelAdmin): ... inlines = [AInline] ...

情景:

我有这样的模型:

class A(models.Model):
    ...

class B(models.Model):
    a = models.ForeignKey(A)
    ...
class AInlinde(admin.StackedInline):
    ...
    model = A
    ...

class BAdmin(admin.ModelAdmin):
     ...
     inlines = [AInline]
     ...
在管理中,我有如下内容:

class A(models.Model):
    ...

class B(models.Model):
    a = models.ForeignKey(A)
    ...
class AInlinde(admin.StackedInline):
    ...
    model = A
    ...

class BAdmin(admin.ModelAdmin):
     ...
     inlines = [AInline]
     ...
现在,当用户删除内联中的某个模型时,我需要在日志中记录,但我无法遵循代码,直到现在,我知道
Badmin
有一个方法:
save\u formset
,这是:

def save_formset(self, request, form, formset, change):
    """
    Given an inline formset save it to the database.
    """
    formset.save()

但是我认为
formset
是通过方法
modelformset\u factory
生成的,所以我不知道何时可以覆盖该表单集的删除行为您不需要自定义默认的
ModelAdmin
删除行为,只需连接到并在模型上获取一个钩子,然后将其删除并记录在那里。

您不需要自定义默认的
ModelAdmin
删除行为,只需连接到并在模型上获取一个钩子,然后将其删除并记录在那里。

覆盖表单集保存或删除对象的最佳方式,创建一个继承自
BaseInlineFormSet
的类,并重写方法
save
save\u现有的\u对象

class NoDeleteFormset(BaseInlineFormSet):
    def save(self, commit=True, request=None):
        """Saves model instances for every form, adding and changing instances
        as necessary, and returns the list of instances.
        """
        if not commit:
            self.saved_forms = []
            def save_m2m():
                for form in self.saved_forms:
                    form.save_m2m()
            self.save_m2m = save_m2m
        return self.save_existing_objects(commit) + self.save_new_objects(commit)

    def save_existing_objects(self, commit=True, request=None):
        self.changed_objects = []
        self.deleted_objects = []
        if not self.initial_forms:
            return []

        saved_instances = []
        for form in self.initial_forms:
            pk_name = self._pk_field.name
            raw_pk_value = form._raw_value(pk_name)

            # clean() for different types of PK fields can sometimes return
            # the model instance, and sometimes the PK. Handle either.
            pk_value = form.fields[pk_name].clean(raw_pk_value)
            pk_value = getattr(pk_value, 'pk', pk_value)

            obj = self._existing_object(pk_value)
            if self.can_delete and self._should_delete_form(form):
                self.deleted_objects.append(obj)
                obj.deleted_at = datetime.now()
                obj.save()

                # log there your user deleting the object!

                continue
            if form.has_changed():
                self.changed_objects.append((obj, form.changed_data))
                saved_instances.append(self.save_existing(form, obj, commit=commit))
                if not commit:
                    self.saved_forms.append(form)
        return saved_instances
然后构造一个继承自
StackedLine
的类:

class MetaInline(StackedInline):
    formset = NoDeleteFormset
    ...

覆盖表单集保存或删除对象的最佳方式是创建一个继承自
BaseInlineFormSet
的类,并覆盖方法
save
save\u现有对象

class NoDeleteFormset(BaseInlineFormSet):
    def save(self, commit=True, request=None):
        """Saves model instances for every form, adding and changing instances
        as necessary, and returns the list of instances.
        """
        if not commit:
            self.saved_forms = []
            def save_m2m():
                for form in self.saved_forms:
                    form.save_m2m()
            self.save_m2m = save_m2m
        return self.save_existing_objects(commit) + self.save_new_objects(commit)

    def save_existing_objects(self, commit=True, request=None):
        self.changed_objects = []
        self.deleted_objects = []
        if not self.initial_forms:
            return []

        saved_instances = []
        for form in self.initial_forms:
            pk_name = self._pk_field.name
            raw_pk_value = form._raw_value(pk_name)

            # clean() for different types of PK fields can sometimes return
            # the model instance, and sometimes the PK. Handle either.
            pk_value = form.fields[pk_name].clean(raw_pk_value)
            pk_value = getattr(pk_value, 'pk', pk_value)

            obj = self._existing_object(pk_value)
            if self.can_delete and self._should_delete_form(form):
                self.deleted_objects.append(obj)
                obj.deleted_at = datetime.now()
                obj.save()

                # log there your user deleting the object!

                continue
            if form.has_changed():
                self.changed_objects.append((obj, form.changed_data))
                saved_instances.append(self.save_existing(form, obj, commit=commit))
                if not commit:
                    self.saved_forms.append(form)
        return saved_instances
然后构造一个继承自
StackedLine
的类:

class MetaInline(StackedInline):
    formset = NoDeleteFormset
    ...

对于2017年寻找软删除和日志删除的任何人。 现在在django 1.11中,您可以覆盖现有的方法

对于正则形式集 有关型号 并将modelformset_factory与新表单集一起使用

product_formset = modelformset_factory(
    ...
    formset = SoftDeleteModelFormSet,
    ...
)

对于2017年寻找软删除和日志删除的任何人。 现在在django 1.11中,您可以覆盖现有的方法

对于正则形式集 有关型号 并将modelformset_factory与新表单集一起使用

product_formset = modelformset_factory(
    ...
    formset = SoftDeleteModelFormSet,
    ...
)

我需要自定义该行为,因为我需要在管理中更改它,而不是在我的所有项目中。我需要自定义该行为,因为我需要在管理中更改它,而不是在我的所有项目中。效果很好,但没有文档记录。。。我们确定它会保持原样吗?效果很好,但没有记录。。。我们确定它会保持原样吗?