python - Django:如何在呈现 View 后更新模型?

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

我有一个显示模型列表的 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/

相关文章:

python - Python 和 Django 时区格式问题

python - 不在 Python 中过滤

python - 是否可以在另一个 View 中发送一个 View 的http请求?

python - 获取 groupby 和 nlargest 之后的行索引

django - 从数据库表列中填充 Django 中的下拉框

c++ - 套接字程序 Python vs C++ (Winsock)

python - django orm : retrieve object and check if it has a relation in one query

python - ./manage.py 迁移时忽略现有表

python - 如何按键对字典进行排序?

python - 检查两个整数范围是否重叠