覆盖 Wagtail 删除确认消息

Override Wagtail delete confirmation message

我想覆盖删除消息(使其信息更丰富,例如“如果删除,您将丢失属于您帐户的 5 件商品”)。

我的想法是每当有人删除我的“会员”时,它也会删除属于该会员的所有项目,确认消息应该提供更多信息。

我发现确认消息来自 wagtail.contrib.modeladmin.views 中名为“confirmation_message”的函数,位于 DeleteView class。此函数将为 Wagtail 删除的模板提供消息。

这是我的会员class:

class Member(ClusterableModel):

user = models.OneToOneField(User, on_delete=models.CASCADE)

email_confirmed = models.BooleanField(default=False)
phone = PhoneNumberField(blank=True)
phone_2 = PhoneNumberField(blank=True)
inside_scoop = models.TextField(blank=True)
lifetime_member = models.BooleanField(default=False)
activation_date = models.DateField(null=True, blank=True, default=timezone.now)
deactivation_date = models.DateField(null=True, blank=True)
points_balance = models.IntegerField(default=0)

favorite_properties = models.ManyToManyField(
    PropertyPage, blank=True, related_name="favorite_properties"
)


base_form_class = MemberFormAdmin

def delete(self: object, *args: list, **kwargs: dict) -> None:
    PropertyPage.objects.filter(owner=self.user).delete()
    self.user.delete()
    return super(self.__class__, self).delete(*args, **kwargs)

这是来自 Wagtail 的默认确认消息: 这位于 wagtail -> contrib -> modeladmin -> views.py

这是删除模板: 这位于 wagtail -> contrib -> modeladmin -> templates → modeladmin → delete.html

这是管理门户中给员工的消息:


更新 1:

在@Gasman 之后,我更新了我的会员 models.py,如下所示:

from wagtail.contrib.modeladmin.options import ModelAdmin
from wagtail.contrib.modeladmin.views import DeleteView

class MemberDeleteView(DeleteView):
    def confirmation_message(self):
        return "Hello there!"


class MemberModelAdmin(ModelAdmin):
    model = Member
    delete_view_class = MemberDeleteView

我将所有这些代码放入我的会员 models.py:

现在我的 models.py 看起来像这样:

但是,还是不行。


更新 2:问题已解决

@Gasman 指出,自定义 ModelAdmin 后,我们必须将其注册到 Wagtail(直到我告诉 Wagtail 使用我自定义的“MemberModelAdmin”,它才会起作用)。

这就是我将自定义模型管理员注册到 Wagtail 的方式:

from wagtail.contrib.modeladmin.options import modeladmin_register

# Now register the Member Model Admin
modeladmin_register(MemberModelAdmin)

这是我的会员models.py:

这是注册自定义模型管理员后的结果:

非常感谢@Gasman 帮助我。

根据 overriding ModelAdmin views 上的文档,创建一个覆盖 confirmation_message 方法的 DeleteView 子类:

from wagtail.contrib.modeladmin.views import DeleteView

class MemberDeleteView(DeleteView):
    def confirmation_message(self):
        sprocket_count = self.instance.sprockets.count()
        return "This member has %d sprockets. Are you sure you want to delete?" % sprocket_count

然后,在该模型的 ModelAdmin 配置中,将您的自定义子类指定为 delete_view_class:

class MemberModelAdmin(ModelAdmin)
    model = Member
    delete_view_class = MemberDeleteView