Python Django,在呈现模板之前执行templatetag

Python Django,在呈现模板之前执行templatetag,python,django,Python,Django,我有一个Django应用程序,有点像网店。在应用程序中,POST在名为posthandler.py的templatetag中处理,如下所示 {% load posthandler %} {% posthandler %} {% block primary %}{% endblock %} 在始终加载的index.html中。之后,在文件中有这样的主位 {% load posthandler %} {% posthandler %} {% block primary %}{% endbloc

我有一个Django应用程序,有点像网店。在应用程序中,POST在名为posthandler.py的templatetag中处理,如下所示

{% load posthandler %}
{% posthandler %}
{% block primary %}{% endblock %}
在始终加载的index.html中。之后,在文件中有这样的主位

{% load posthandler %}
{% posthandler %}
{% block primary %}{% endblock %}
现在,该主位显示一个值stock,该值可能已经在posthandler位中进行了调整。也就是说,该值可能过时。这样做的效果是,一个人单击一个项目,将其添加到他们的订单列表中,但在库存值正确反映数据库中的值之前,页面需要刷新两次

我认为这是因为处理TemplateTag的顺序,类似这样的东西

  • 用户单击按钮以添加到订单列表
  • 页面通过视图重新加载,首先根据数据库中当前的内容在index.html中呈现股票价值
  • py运行,从库存中减去一个,因此数据库现在是最新的
  • 页面显示错误的数字,因为该值是在调整之前从数据库中检索到的

  • 我想在视图中处理post,但我希望在所有不同的页面上运行相同的posthandler,所以这似乎不是一种方法。有更好的方法吗?或者,我可以让主块仅在templatetags之后执行吗?

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

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


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

    我感觉您在templatetag中做不应该在那里做的事情。我从未读过关于这方面的限制,但我认为从概念上讲,模板标记应该是无状态的,而不是修改数据库内容

    要在视图中完成所需的工作而不产生逻辑重复,可以使用基于类的视图,并让它们从实现数据修改的公共Mixin类继承,或者使用公共装饰器装饰它们并在该装饰器中实现数据修改


    但是,如果应该对所有视图进行修改,那么中间件可能就是最好的选择。

    我没有这样的页面,因为我没有真正考虑过这一点。我会调查一下中间软件。有一个专门的页面来接收和处理这个帖子请求似乎是一个不错的选择。这将更清晰、更容易,并将节省检查请求方法的开销,如果是POST,则检查提交的表单是否是您要处理的表单。我希望过程透明。也许以后甚至不用重新加载。到目前为止,您建议的中间件解决方案运行良好。非常感谢。