簡體   English   中英

在 django 管理頁面中刪除模型對象時如何調用函數? (或覆蓋刪除操作?)

[英]How to call a function when you delete a model object in django admin page? (or override delete action?)

每當我通過管理頁面刪除模型對象時,我都需要調用一個函數。 我怎么能做這樣的事情?

是的,它被稱為 post_delete 信號。 這是一種方法(您可以將其添加到 models.py 文件的底部,或者至少在您的模型之后:

from django.db.models.signals import post_delete
from django.dispatch import receiver

@receiver(post_delete, sender=YourModelName)
def signal_function_name(sender, instance, using, **kwargs):
    your_function(args)

刪除對象后將調用此函數。 其他類型的信號外,還有 pre_save、post_save 等。

該信號將在從管理員中刪除或任何地方的任何刪除操作(您的其他邏輯、視圖、python shell 等)中調用。

在您的應用程序目錄中創建一個文件signals.py ,例如,當文章被刪除時,我試圖從文章作者中刪除所有相關標簽。

from django.db.models.signals import post_delete
from django.dispatch import receiver

from articles.models import Article
from common.methods import tagClear

@receiver(post_delete, sender=Article)
def authorTagClear(sender, instance, using, **kwargs):
    tagClear(instance, instance.author, against=1)

apps.py中定義一個ready 方法,這將在應用程序運行時插入signals

from django.apps import AppConfig


class ArticlesConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'articles'

    def ready(self):
        import articles.signals
        return super().ready()
def delete(self):
files = WidgetFile.objects.filter(widget=self)
if files:
    for file in files:
        file.delete()
super(Widget, self).delete()

這觸發了每個相關對象上必要的 delete() 方法,從而觸發了我的自定義文件刪除代碼。 是的,它的數據庫成本更高,但是當您嘗試刪除硬盤上的文件時,多打幾次數據庫並不是什么大開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM