后处理渲染的django模板

时间:2015-08-20 23:12:08

标签: django django-templates django-template-filters

假设我有一个为django编写的基本自定义模板标记。在我的模板中,假设我这样使用它:

getData()

{% do_something "x" %} {% do_something "y" %} {% do_something "z" %} 需要从模型中获取信息,即由标记呈现的数据库。假设我每次在模板中添加对do_something的调用时,django会调用我的数据库吗?

如果是这样,我想找到另一种解决方案,这是我能想到的唯一解决方案:

编写一个“响应后处理器”中间件,它将解析呈现的响应以查找某种占位符,比如do_something__x__等,整理它们,执行单个分组查询,然后用相关内容替换占位符。

这对我来说似乎相当“hacky”,它感觉不对。这是我唯一的选择吗?

2 个答案:

答案 0 :(得分:0)

您还可以以某种方式缓存模板标记首次调用时使用的对象,以便下次调用可以重复使用它们。模板标签正在获取上下文变量,您可以在此处添加您的“缓存”标签。对象作为变量。

答案 1 :(得分:0)

首先:请不要做你提出的黑客行为,这似乎非常容易出错和发臭。

无论如何,答案很大程度上取决于do_something实际做了什么。如果它以某种方式访问​​模板上下文,你已经存储了模型实例然后没有,如果已经从服务器获取模型,Django不会多次命中数据库 - 来自db的数据被存储在instance.__dict__

但是如果do_something逻辑不能与模板上下文一起使用,而是有自己的逻辑而不是 - 那么它将被调用一次。您可以使用https://pythonhosted.org/django-memoize/之类的缓存工具,但在您的情况下,只有在使用相同参数调用函数时,缓存才适用于该用户案例。事实并非如此 - 你用x,y,z来称呼它......

如果数据库逻辑对于x,y,z调用是相同的,则可以创建访问数据库的缓存函数,而不是从模板标记中调用此函数。