[英]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.