python – Django:如何在呈现视图后更新模型?

我有一个显示模型列表的视图.在呈现视图之后,需要更新某些模型的某些属性:即,用户应该在第一次访问时看到原始的,未更改的值以及连续访问时(或页面重新加载时)的更新值.

我以为我可以通过基于类的通用视图来实现这一点. official documentation暗示“在调用泛型视图之前或之后做一些额外的工作”(强调我的),但所有给出的例子都会在模型显示之前影响模型.

我调查了信号,但无济于事.

产生异步任务是一种选择,但是,因为我需要做的就是更新几个模型中的字段(可能是一个或没有)并保存它们,这对于手头的任务来说似乎有些过分.

可以使用ajax请求来触发更新,或者使用自定义模板标记来显示相关字段并在此后更新它们.我不喜欢这两个,因为他们将应用程序逻辑移动到视图层. ajax技术还增加了第二个请求的开销.

然而,我似乎没有别的选择,或者我呢?是否有更实用的技术可以在渲染模板后插入通用视图或请求并执行额外的逻辑?

最佳答案 这里不需要任何聪明的东西.渲染模板不需要是视图的结尾 – 只有在您实际将其作为响应返回时才会出现.他们不必处于同一步骤.

所以:

def my_view(request, params):
    ... do something ...
    response = render_to_response('my_template.html', {'foo': bar'})
    ... do something after rendering ...
    return response

现在,如果您需要在很多视图中执行此操作,您可能希望在装饰器中执行此操作:

def my_decorator(view):
    def my_func(request, params):
        response = view(request, params)
        ... do something after rendering ...
        return response
    return my_func

现在您可以使用@my_decorator来装饰您的视图,并在渲染后执行操作.

…或者,它只是发生在我身上,如果你想在每个视图中都这样做,你可以在中间件中完成它(只需定义process-response方法).

注释后编辑基于类的通用视图使用新的TemplateResponse类.您可以添加在使用post-render callback实际呈现模板后发生的任务.

点赞