Django,在渲染模板之前执行templatetag

时间:2016-02-29 16:33:49

标签: python django

我有一个Django应用程序,有点像网上商店。在应用程序中,POST在名为posthandler.py的模板标签中处理,如此

{% load posthandler %}
{% posthandler %}

在始终加载的index.html中。之后,在文件中有像这样的主要位

{% block primary %}{% endblock %}

现在,该主位显示可能已在后处理程序位中调整的值stock。意思是,价值可能是陈旧的。这具有人们点击某个项目,将其添加到他们的订单列表中的效果,但是在库存值正确反映数据库中的值之前需要两次刷新的页面。

我认为这是因为处理模板标签的顺序,就像这样;

  1. 用户点击按钮添加到订单列表
  2. 页面通过视图重新加载,首先根据数据库中当前的内容在index.html中呈现库存值
  3. posthandler.py运行,从库存中减去一个,因此数据库现在是最新的。
  4. 页面显示的编号错误,因为在调整之前已从数据库中检索到该值。
  5. 我会考虑在视图中处理帖子,但我希望在所有不同的页面上运行相同的posthandler,所以这似乎不太合适。有一个更好的方法吗?或者,我可以让主要块仅在templatetags之后执行吗?

2 个答案:

答案 0 :(得分:2)

处理模板中的表单确实是一个设计错误。使用middlewares应该符合您的需求。

另一种解决方案是创建一个View mixin,并使所有视图都从该mixin继承。但是使用中间件应该会更好。

但是,为什么没有一个页面可以处理此POST请求,并在表单处理后重定向到准确的页面?

答案 1 :(得分:0)

我觉得你在模板标签中做的事情不应该在那里完成。我从未读过关于此目的的限制,但我认为,从概念上讲,模板标签应该是无状态的,而不是修改数据库内容。

要在没有逻辑重复的情况下在视图中执行所需的工作,您可以使用基于类的视图,并让它们从您实现数据修改的常见Mixin类继承,或者使用通用装饰器修饰它们并在装饰师。

但是如果要对所有视图进行修改,那么中间件Antoine suggests可能就是这样。