选项 1 - 使用信号而不是 Hooks
一个选项可以是利用 Dango Signals 系统,它类似于钩子,但更像是消息,而不是注入内容/数据的方式。
这并不能很好地向用户展示为什么某事被阻止,而只会引发错误(如果需要,您可以使用不同的错误类型)。
这个答案大致基于similar question for generic blocking of deleting。
signals.py
from django.db.models import ProtectedError
from django.db.models.signals import pre_delete
from django.dispatch import receiver
from wagtail.images import get_image_model
image_model = get_image_model()
@receiver(pre_delete, sender=image_model, dispatch_uid='post_pre_delete_signal')
def protect_posts(sender, instance, using, **kwargs):
# Note: This will block ANY deleting of image models
# Checking logic can go here
raise ProtectedError('Only unpublished posts can be deleted.', instance)
apps.py
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'my_app.base' # must match the configured app name
def ready(self):
# signals are imported, so that they are defined and can be used
import my_app.base.signals ## the import path of the signals file
选项 2 - 覆盖图像确认删除模板
Wagtail admin templates can all be overridden,因此您可以利用该系统替换内容(或简单地附加到内容)以提供警告甚至阻止显示删除按钮。
templates/wagtailimages/images/confirm_delete.html
{% extends "wagtailimages/images/confirm_delete.html" %}
{% block content %}
{{ block.super }}
<strong>Warning: Image is also linked to A, B, C</strong>
{% endblock %}