2016-02-29 57 views
4

我有一个Django应用程序,它有点像一个网上商店。在应用中,POST是在一个名为posthandler.py这样Django,在呈现模板之前执行templatetag

{% load posthandler %} 
{% posthandler %} 

在那种总是加载中的index.html templatetag处理。在此之后,该文件中有这样的

{% block primary %}{% endblock %} 

主位现在,这主要位显示一个值,股票,这就有可能在posthandler位进行了调整。意思是,价值可能是陈旧的。这具有人物点击物品的作用,将其添加到他们的订单列表中,但是在库存值正确地反映数据库中的值之前需要两次刷新的页面。

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

  1. 用户点击按钮添加通过视图orderlist
  2. 页面将重新加载,首先呈现在index.html中的股票价值基于什么是目前在DB
  3. 的posthandler.py运行,从其减去一个来自股票,所以数据库现在是最新的。
  4. 页面显示错误的编号,因为该值是在调整前从数据库中检索的。

我认为要处理该视图中的帖子,但我希望同一个处理程序可以在所有不同的页面上运行,所以看起来似乎没有办法。有一个更好的方法吗?或者,我可以让主块在模板标签之后执行吗?

回答

2

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

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

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

+0

我没有这样一个页面,因为我没有真正想到这一点。我会研究中间件。 – Eloque

+0

拥有专门用于接收和处理此POST请求的单个页面似乎是要走的路。它会更清晰,更容易,并且会节省检查请求方法的开销,并且在它为POST的情况下,检查提交的表单是否是您想要处理的表单。 –

+0

我有点想要这个过程是透明的。也许以后甚至没有重新加载。您建议的中间件解决方案目前工作良好。谢谢。 – Eloque

0

我有这样的感觉,你在模板标签中做的事情不应该在那里完成。我从来没有读过关于这方面的限制,但我认为在概念上,模板标签应该是无状态的,而不是修改数据库内容。

要在视图中完成所需的工作而没有逻辑重复,您可以使用基于类的视图,并从通用Mixin类继承,在该类中实现数据修改,或使用通用装饰器修饰它们并实现数据修改在那个装饰者。

但是,如果修改应该为全部视图完成,那么中间件作为Antoine suggests可能是要走的路。