Django:如何在渲染视图后更新模型?

时间:2011-05-31 21:49:40

标签: python django django-views django-generic-views

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:8)

这里不需要任何聪明的东西。渲染模板不需要是视图的结尾 - 只有在您实际返回作为响应时才会出现。他们不必同步。

所以:

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实际呈现模板后发生的任务。

答案 1 :(得分:0)

从视图或函数中捕获返回值,进行一些处理,然后将其踢出堆栈。

def foo(*args):
  ret = bar(*args)
  do_something()
  return ret

答案 2 :(得分:0)

你能抓住这个对象的两个副本,修改并保存一个副本,同时将另一个(未经修改和过时的)传递给视图吗?

我还没有使用基于类的通用视图,所以我不能给你一个具体的例子。

答案 3 :(得分:0)

Django还带有built-in signal request_finished,这是在django处理完请求后发送的。

答案 4 :(得分:0)

如果您的项目已经使用芹菜,您可以创建一个任务来更新模型和 并致电

your_task.delay() 

您可以使用倒计时参数指定启动任务之前经过的时间。

如果你没有使用芹菜,你将来会有机会:)