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

33
我希望在特定模型保存后向管理员显示一条消息,比如“现在启用系列”。 如果这是一个列表操作(message_user),我可以看到如何实现,但我不知道如何从主要的CRUD表单中实现。 有人知道怎么做吗? 谢谢。

当用户在管理员中保存条目时,我收到了一条消息(页面顶部的黄色背景),但不知何故它消失了。我该如何找回它?现在只有在用户出错时才会收到消息。 - Timo
4个回答

74

虽然这是一个老问题,但至少值得举一个小例子,因为我认为这是一个相当普遍的问题。

@Davor Lucic 指出了正确的解决方案。 截至今天,Django 带有一个很酷的消息框架,可以大大帮助解决这个问题。

那么,假设您想在 Django Admin 中提醒每当 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"))

不用说,你最好确定你添加的代码是真正安全的。

没有什么特别的,但也许(希望如此)有人会觉得它有用。


7
使用format_html(从django.utils.html导入)代替mark_safeformat_html可以使HTML更安全地呈现在页面上,具体使用方法请参考官方文档 - nik_m
3
这对我有用,但问题是我也看到了内置消息,我只想返回错误消息,但它显示出错误和成功两种消息。成功的消息来自 Django。我尝试在发现错误时返回,但仍然会看到两种消息。 - Uday Swami

17

9

@Seether的答案是正确的,但正如@Uday在评论中提到的那样,它显示了2条消息。

仅显示一个自定义消息

由@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')

非常感谢!我发现像您这样覆盖message_user,也适用于messages.success (或 warning 等)而不是 messages.add_message,它们是等效的。 - cjauvin
很遗憾,如果你的信息是基于一种关系的话,这种方法就不起作用了,因为这些关系似乎只会在后期更新。 - undefined

0
通过重写"save_model()",您可以设置和显示自定义消息,并且不要忘记像下面展示的那样导入"messages"
from django.contrib import admin
from .models import MyModel
from django.contrib import messages # Here

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    # Here
    def save_model(self, request, obj, form, change):
        obj.save()
        messages.add_message(request, messages.INFO, 'Custom Message')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接