如何在保存模型后向Django管理员显示消息?

35 投票
4 回答
43780 浏览
提问于 2025-04-16 04:09

我想在管理员保存某个特定模型后显示一条消息,比如“现在启用系列”。

我知道如果是列表操作(message_user),我该怎么做,但我不知道如何从主CRUD表单中做到这一点。

有没有人知道怎么做?

谢谢。

4 个回答

10

@Seether 的回答是对的,但正如 @Uday 在评论中提到的,它会显示两条消息。

只显示一条自定义消息

由 @Dylan 回答 对于任何需要以更灵活的方式消除 Django 自动成功消息的人 或者

from django.contrib import messages

class SomeAdmin(admin.ModelAdmin):
      def message_user(self, *args): # overridden method
            pass

      def save_model(self, request, obj, form, change):

          messages.add_message(request, messages.INFO, 'Custom message goes here')
17

你可以在 save_model 方法上进行修改,这个方法是在 ModelAdmin 里。这样的话,你就可以在保存你的对象之后,使用 消息功能添加消息

74

这个问题虽然老旧,但我觉得还是值得分享一个小例子,因为这个问题挺常见的。

@Davor Lucic 提出了正确的解决方案。现在,Django 提供了一个很不错的 消息框架,这对解决这个问题很有帮助。

比如说,你想在 Django 管理后台中,当你的 Car 模型里的汽车对象更换车主时,给出一个通知,你可以这样做:

admin.py

from django.contrib import admin
from django.contrib import messages

from .models import Car


@admin.register(Car)
class CarAdmin(admin.ModelAdmin):
    list_display = ('owner', 'color', 'status', 'max_speed', )

    def save_model(self, request, obj, form, change):
        if 'owner' in form.changed_data:
            messages.add_message(request, messages.INFO, 'Car has been sold')
        super(CarAdmin, self).save_model(request, obj, form, change)

值得一提的是,如果你想在消息中包含 HTML 标签,你需要添加:

from django.utils.safestring import mark_safe

这样你就可以做到类似的事情:

messages.add_message(request, messages.INFO, mark_safe("Please see <a href='/destination'>here</a> for further details"))

当然,确保你添加的代码是非常安全的,这一点是非常重要的。

这些内容并没有什么特别之处,但也许(希望如此)会对某些人有帮助。

撰写回答