Django Admin-在某些情况下防止保存并向用户显示消息

时间:2019-05-10 15:13:42

标签: python django django-models django-admin

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

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

我尝试引发异常,以String等形式返回消息,但似乎无济于事。尽管我可以阻止保存的发生,但是如果我不返回模型,最终会得到堆栈跟踪。

我已经看到了使用clean()方法或信号的各种解决方案,但似乎都不适合这种需求。

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

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

  2. 对外部服务进行API调用以获取信息

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

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

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

3 个答案:

答案 0 :(得分:0)

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)

答案 1 :(得分:0)

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)

答案 2 :(得分:0)

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

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

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