【问题标题】:How to prevent "Changed successfully" message when overriding save_model method覆盖 save_model 方法时如何防止“更改成功”消息
【发布时间】:2014-10-16 10:31:36
【问题描述】:

我试图让用户在管理员中查看记录,但不保存任何内容。所以我正在尝试做这样的事情:

def save_model(self, request, obj, form, change):
    """Override save method so no one can save"""
    messages.error(request, "No Changes are permitted from this screen."
        " To edit projects visit the 'Projects' table, and make sure you are"
        " in the group 'Visitor_Program_Managers'.")

这可行,但是我在下一个屏幕上收到两条消息:

我在上面的信息首先 然后是“...已成功更改。”

如何阻止第二条消息?

【问题讨论】:

  • 与其阻止 Django 添加该消息,不如手动迭代消息以消除成功消息。请参阅here,了解另一种在管理员中将模型设为只读的方法。
  • @Greg,你的解决方案是什么?
  • stackoverflow.com/a/62246926/7300865 只显示一条消息。

标签: django django-admin


【解决方案1】:

您可以隐藏某些消息并显示其他消息。在您的情况下,您有兴趣不显示成功消息。您可以执行以下操作:

def save_model(self, request, obj, form, change):
    messages.set_level(request, messages.ERROR)
    messages.error(request, 'No changes are permitted ..')

【讨论】:

  • 有没有办法同时替换成功和错误信息。我尝试过,但每次操作都会收到两条消息。自定义和默认。
  • @ShreyaMaria 检查此stackoverflow.com/a/62246926/7300865。只显示一条消息。
  • @MuhammadFaizanFareed,谢谢
【解决方案2】:

对于任何需要以比接受的答案更灵活的方式消除自动 Django 成功消息的人,您可以执行以下操作:

from django.contrib import messages, admin

class ExampleAdmin(admin.ModelAdmin):
    def message_user(self, *args):
        pass

    def save_model(self, request, obj, form, change):
        super(ExampleAdmin, self).save_model(request, obj, form, change)
        if obj.status == "OK":
            messages.success(request, "OK!")
        elif obj.status == "NO":
            messages.error(request, "REALLY NOT OK!")

【讨论】:

    【解决方案3】:

    如果你想在失败消息的情况下阻止成功消息,那么你必须设置消息的错误级别。

    类似的东西 ->

        if already_exist:
            messages.set_level(request, messages.ERROR)
            messages.error(request, 'a and b mapping already exist. Please delete the current entry if you want to override')
        else:
            obj.save()
    

    它将避免同时出现两条消息(成功和失败),因为我们通过更改错误级别来抑制成功消息。

    【讨论】:

      【解决方案4】:

      只需重写 def message_user(...) 方法,如下:

      def message_user(self, request, message, level=messages.INFO, extra_tags='',
                       fail_silently=False):
          pass
      
      def save_model(self, request, obj, form, change):
          messages.success(request, 'Write your overrided message here...')
          pass
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多