【问题标题】:Custom error message in Django admin actionsDjango 管理操作中的自定义错误消息
【发布时间】:2011-03-15 13:47:49
【问题描述】:

我编写了自定义管理操作,基本上对模型中的某些字段执行QuerySet.update()。有时不应允许这些操作完成 - 相反,它们应该显示错误并且不执行任何操作。我试过message_user,但它显示一个绿色复选标记,而我希望它显示 Django 管理错误消息。

我在网上找到的一个解决方案是使用ModelForm,但我认为这不适用于这种情况,因为这里的一切都发生在管理员更改列表页面上。

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    你可以使用 django.contrib.messages 后端

    from django.contrib import messages
    
    def my_action(self, request, queryset):
      #do something
      messages.error(request,'Error message')
    

    这将显示错误消息和红色错误标志。

    【讨论】:

      【解决方案2】:
      from django.contrib import messages
      ...
      self.message_user(request, "The message", level=messages.ERROR)
      

      也可以使用(messages.ERROR、messages.WARNING、messages.DEBUG、messages.INFO、messages.SUCCESS)

      【讨论】:

        【解决方案3】:

        不确定这是否已在较新的 django 版本中得到修复(我发现您在 django 1.2.1 和 django-grappelli 2.0 中描述的行为),但如果您使用上述 Bartek 的方法,您可能还想更改管理模板以不同方式显示消息。具体在base.html中:

        改变这个:

        {% if messages %}
                <ul class="messagelist">{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>
            {% endif %}
        

        到这里:

        {% if messages %}
                <ul class="messagelist">{% for message in messages %}<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message}}</li>{% endfor %}</ul>
            {% endif %}
        

        您可能还需要在此基础上调整一些 CSS,但至少它会在 HTML 中作为不同的 li 类出现。

        这是一个示例 CSS 更改(与 grappelli 兼容)

        ul.messagelist li.error {
        background: url('../img/icons/icon-no.png') 20px 50% no-repeat;
        background-color: #f2e6e6;
        
        }
        

        【讨论】:

          【解决方案4】:

          在管理员中使用的message_user 函数只是使用contrib.messages 包。你可以试试这样的:

          from django.contrib import messages
          
          # Then, when you need to error the user:
          messages.error(request, "The message")
          

          您还可以使用warningdebuginfosuccess 代替error

          希望有帮助!

          【讨论】:

          • 谢谢巴泰克。使用这段代码,我仍然很困惑为什么我的消息没有在管理员中显示为错误消息,直到我发现我的路径中的一个应用程序(在本例中为 django-admin-tools)覆盖了 admin/base.html模板,但尚未更新消息输出 html 以向每条消息添加适当的类。如果您的消息已损坏,请确保您的管理模板反映最新的 (django 1.2) 更新。
          • 嗨,Bartek,我尝试这样做,但没有成功。该消息已打印有绿色复选标记。 zlovelady,我已经更新了管理模板,但没有解决问题。
          • 这不涉及“并且不做任何事情”部分。例如,如果模型的保存引发异常,则应显示错误并且不应保存模型。使用this answer,错误确实显示正确,但绿色成功消息仍然跟随红色错误消息。如何不显示成功消息?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-03
          • 1970-01-01
          • 2013-01-26
          • 1970-01-01
          • 2015-05-15
          • 2014-07-14
          • 2022-10-19
          相关资源
          最近更新 更多