我正在整理一个Django应用-创建并注册了模型和模型表单。
添加或编辑特定模型记录时,我需要致电外部服务以获取一些信息。如果成功检索到信息,我想更新该模型中用户不知道的列并保存该模型。如果呼叫失败,则需要阻止保存并向用户返回自定义消息。
我尝试引发异常,以String等形式返回消息,但似乎无济于事。尽管我可以阻止保存的发生,但是如果我不返回模型,最终会得到堆栈跟踪。
我已经看到了使用clean()方法或信号的各种解决方案,但似乎都不适合这种需求。
我需要发生的事情的顺序:
验证输入的表单数据(自动发生)
对外部服务进行API调用以获取信息
将信息分配给模型道具并保存模型
如果API调用失败,请取消save()并向用户显示消息,告知他们保存失败,并说明原因。如果保存失败,则该页面应重新加载,而不应重定向到列表页面。
我似乎无法找到一个简单的解决方案-感谢您提供任何帮助!
答案 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()
来阻止保存对象。