我有一个显示模型列表的 View 。某些模型的某些属性需要在 View 呈现后更新:也就是说,用户应该在第一次访问时看到原始的、未更改的值,并在连续访问时(或在页面重新加载时)看到更新后的值.
我认为我可以通过基于类的通用 View 来实现这一点。 official documentation提示“在调用通用 View 之前或之后做一些额外的工作”(强调我的),但给出的所有示例都会在显示之前影响模型。
我查看了信号,但无济于事。
产生一个异步任务是一种选择,但是,由于我需要做的只是更新几个模型(可能一个或一个)中的字段并保存它们,这对于手头的任务来说似乎有点过分了。
可以使用 ajax 请求来触发更新,或者使用自定义模板标签来显示相关字段并在之后更新它们。我不喜欢两者,因为它们将应用程序逻辑移到了 View 层中。 ajax 技术还增加了第二个请求的开销。
然而,我似乎别无选择,是吗?是否有更实用的技术来插入通用 View 或请求并在呈现模板后执行额外逻辑?
最佳答案
这里不需要任何聪明的东西。呈现模板不一定是 View 的结束 - 只有当您实际返回它作为响应时才会出现。它们不必在同一步骤中。
所以:
def my_view(request, params):
#...do something...
response = render_to_response('my_template.html', {'foo': bar})
# ...do something after rendering...
return response
现在,如果您需要在很多 View 中执行此操作,您可能希望在装饰器中执行此操作:
def my_decorator(view):
def my_func(request, params):
response = view(request, params)
#...do something after rendering...
return response
return my_func
现在您可以使用 @my_decorator
装饰您的 View ,该操作将在渲染后执行。
... 或者,我刚刚想到,如果您想在每个 View 中执行此操作,您可以在中间件中执行此操作(只需定义 process-response
方法)。
评论后编辑 基于类的通用 View 使用新的 TemplateResponse 类。您可以添加在模板实际呈现后发生的任务 post-render callback .
关于python - Django:如何在呈现 View 后更新模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6193974/