Django 管理员 : override delete method

标签 django django-admin

我有 admin.py 如下:

  class profilesAdmin(admin.ModelAdmin):
     list_display = ["type","username","domain_name"]

现在我想在删除对象之前执行一些操作:
  class profilesAdmin(admin.ModelAdmin):
     list_display = ["type","username","domain_name"]

     @receiver(pre_delete, sender=profile)
     def _profile_delete(sender, instance, **kwargs):
        filename=object.profile_name+".xml"
        os.remove(os.path.join(object.type,filename))

如果我使用这样的删除信号方法,我会收到一条错误消息 self应该是第一个参数。

如何修改上述功能?
我想检索被删除对象的 profile_name。如何才能做到这一点?

我还尝试覆盖 delete_model 方法:
def delete_model(self, request, object):
    filename=object.profile_name+".xml"
    os.remove(os.path.join(object.type,filename))
    object.delete()

但是如果必须一次删除多个对象,这将不起作用。

最佳答案

您的 delete_model 走在正确的轨道上方法。当 django 管理员一次对多个对象执行操作时,它使用 update function .但是,正如您在文档中看到的,这些操作仅使用 SQL 在数据库级别执行。

您需要添加您的 delete_model方法作为 custom action在 Django 管理员中。

def delete_model(modeladmin, request, queryset):
    for obj in queryset:
        filename=obj.profile_name+".xml"
        os.remove(os.path.join(obj.type,filename))
        obj.delete()

然后将您的功能添加到您的模型管理员 -
class profilesAdmin(admin.ModelAdmin):
    list_display = ["type","username","domain_name"]
    actions = [delete_model]

关于Django 管理员 : override delete method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15196313/

相关文章:

python - SimpleListFilter 调用了两次,最后 ?e=1

python - Django 中 Raw 的 MySQL SET 语法

django - 在django中如何可以通过URL传递数据?

django - 通过 Django Admin 保存模型时优雅地处理崩溃

python - 在管理中预填充 django 水平过滤器

python - 如何保存在 django 管理站点中创建和修改记录的用户?

Django:在管理界面中将多个用户添加到一个组

python - 为什么 python-django 元素中管理 url 的 css 没有加载?

django模板: Is extended template able to change css in parent page?

带有 ManyToManyField 的 Django 自定义管理器