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

Rog*_*ger 19 django django-admin

我想在保存特定模型后向管理员显示一条消息,例如"现在启用该系列".

如果它是一个列表操作(message_user),我可以看到我如何做到这一点,但我无法从主CRUD表单中看到如何做到这一点.

有谁知道怎么样?

谢谢

See*_*her 42

老问题,但值得至少一个小例子,因为我认为这是一个非常普遍的问题.

@Davor Lucic指出了正确的解决方案.截至今天,Django提供了一个很酷的消息框架,在这方面有很大帮助.

所以,假设你想在汽车模型中的汽车对象改变所有者时在Django Admin中发出通知,你可以这样做:

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)
Run Code Online (Sandbox Code Playgroud)

值得一提的是,如果要在邮件中包含HTML标记,则必须添加:

from django.utils.safestring import mark_safe
Run Code Online (Sandbox Code Playgroud)

这允许你做类似的事情:

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

无需说你最好确保你添加的代码真的很安全.

没有什么特别的,但也许(并且希望)有人会觉得它很有用.

  • 而不是`mark_safe`,使用[`format_html`](https://docs.djangoproject.com/en/dev/ref/utils/#module-django.utils.html)(`来自django.utils.html import format_html`). (6认同)
  • 这对我有用,但问题是我也看到内置消息,我只想返回错误消息,但同时显示错误和成功消息。成功消息来自django。当我看到错误但仍然看到两条消息时,我尝试返回。 (2认同)

Dav*_*cic 14

您可以覆盖save_model方法,ModelAdmin以便在保存对象后使用消息框架添加消息.


Muh*_*eed 6

@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')
Run Code Online (Sandbox Code Playgroud)