【问题标题】:Django Admin - prevent save under certain conditions and display message to userDjango Admin - 在某些条件下防止保存并向用户显示消息
【发布时间】:2019-05-10 15:13:42
【问题描述】:

我正在整合一个 Django 应用程序 - 创建并注册模型和模型表单。

添加或编辑特定模型记录时,我需要调用外部服务以获取一些信息。如果成功检索信息,我想更新该模型上用户不知道的列并保存模型。如果调用失败,我需要阻止保存发生并将自定义消息返回给用户。

我尝试过引发异常,将消息作为字符串返回等,但似乎没有任何效果。虽然我可以阻止保存的发生,但如果我不返回模型,我最终会得到一个堆栈跟踪。

我见过各种使用 clean() 方法或信号的解决方案,但似乎没有一个适合需要。

我需要发生的事情的顺序:

  1. 验证正在输入的表单数据(自动发生)

  2. 对外部服务执行 API 调用以检索信息

  3. 将信息分配给模型道具并保存模型

  4. 如果 API 调用失败,取消 save() 并向用户显示消息,告诉他们保存失败并说明原因。如果保存失败,则页面应重新加载,而不是重定向到列表页面。

我似乎无法找到一个简单的解决方案 - 感谢任何帮助!

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:
    from django.contrib import messages
    
    class MyAdminView(admin.ModelAdmin):
        def save_model(self, request, obj, form, change):
            try:
                super(MyAdminView, self).save_model(request, obj, form, change)
            except Exception as e:
                messages.set_level(request, messages.ERROR)
                messages.error(request, e)
    

    【讨论】:

    • 谢谢。正是我需要的。
    • @bradj 不客气
    【解决方案2】:

    You can overwrite save_model of ModelAdmin.

      class MyAdminView(admin.ModelAdmin):
           def save_model(self, request, obj, form, change):
               super(MyAdminView, self).save_model(request, obj, form, change)
    

    【讨论】:

    • 这不太适合需要。虽然我可以阻止保存页面重定向到列表页面并显示成功消息。我应该补充一点,尽管我认为这是在正确的轨道上,并且可能是通向整体解决方案的途径
    • 你不能做什么?你想要的不是保存和通知正确的消息
    • 我已经编辑了这个问题,让它更清楚一点 - 为造成的混乱道歉。我需要停止保存模型并告诉用户问题出在哪里(在这种情况下,外部 API 调用失败)
    • 您是否尝试过引发错误? docs.djangoproject.com/en/2.2/ref/exceptions
    • 在 save() 或 save_model() 中引发异常会导致堆栈跟踪显示在浏览器中。
    【解决方案3】:

    在我看来,成功的 API 调用是验证过程的一部分。 根据这个观点,你可以只检查clean() 中的API 连接,然后抛出一个yourForm.add_error(None, "sometext"),如果出错就会出现在表单上。

    然后您可以继续覆盖yourModelAdmin.save_model(),包括 这次将获取和处理数据的新 API 调用,相信一切都会按预期工作。

    请记住,根据文档here,不应使用ModelAdmin.save_model() 来阻止保存对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 2021-05-22
      相关资源
      最近更新 更多