5

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

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

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

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

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

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

4

5 回答 5

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 类。您可以使用渲染后回调添加在模板实际渲染后发生的任务。

于 2011-05-31T22:01:33.157 回答
0

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

def foo(*args):
  ret = bar(*args)
  do_something()
  return ret
于 2011-05-31T21:52:58.017 回答
0

您能否获取该对象的两个副本,修改并保存一个,同时将另一个(未修改和过时)的一个传递给视图?

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

于 2011-05-31T21:54:20.457 回答
0

Django 还带有一个内置的信号 request_finished,它在 django 处理完请求后发送。

于 2011-05-31T23:21:33.710 回答
0

如果您的项目已经使用 celery,您可以创建一个任务来更新模型并调用

your_task.delay() 

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

如果您不使用芹菜,那么您将来会使用 :)

于 2011-06-01T03:04:11.417 回答