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

问题描述 投票:4回答:5

我有一个显示模型列表的视图。有些模型的一些属性需要在视图渲染后更新:也就是说,希望用户在第一次访问时看到原始的、不变的值,而在连续访问时(或在页面重新加载时)看到更新的值。

我想我可以通过基于类的通用视图来实现这一点。我想可以通过基于类的通用视图来实现这个目标。公文 暗示 "之前或之后做一些额外的工作"。之后 调用通用视图"(强调是我的),但所有给出的例子都会影响模型,然后再显示。

我研究了信号,但没有用。

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

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

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

python django django-views django-generic-views
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类。您可以添加在模板实际呈现后发生的任务,并在该类中使用 渲染后回调.


0
投票

从视图或函数中捕获返回值,做一些处理,然后把它踢到堆栈中。

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

0
投票

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

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


0
投票

Django还自带了一个 内置信号 request_finished如果你的项目已经使用了芹菜,你可以创建一个任务来更新模型,然后调用这个任务,这个任务是在django处理完请求之后发送的。


0
投票

如果你的项目已经使用了芹菜,你可以创建一个任务来更新模型,然后调用

your_task.delay() 

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

如果你没有使用芹菜,那么你将来有可能会使用:)

© www.soinside.com 2019 - 2024. All rights reserved.