在Django模板中调用Python函数
在一个Django模板里,我想对一个模板变量使用split函数,然后获取最后一个元素,所以我做了类似这样的操作:
{{ newsletter.NewsletterPath.split('/').-1 }}
可惜的是,它不支持split。有些人可能会建议我在视图里进行split,但我不太确定怎么做,因为我需要对所有记录都进行这个操作。如果我能在模板里做到这一点,那就简单多了。有没有办法可以这样做呢?
4 个回答
5
模板故意不允许这样做。这样设计的目的是为了防止你把业务逻辑放在模板里,因为模板主要是用来处理页面的布局的。
所以,一个可行的方法是在你的新闻通讯模型里定义一个叫做NewsletterPathLastElement(self)的函数,然后在模板中调用这个函数。
9
来自Django书籍的内容:
注意,在调用方法时不要加括号。同时,不能给这些方法传递参数;你只能调用那些不需要参数的方法。
所以,如果你想在模板中调用一个不带参数的方法,那是可以的。否则,你就得在视图中去做。
6
你说的“它不喜欢分割”是什么意思?它是怎么表现出不喜欢的呢?
如果我没记错的话,你不能随便给从Django模板调用的方法传递参数,而且在模板中可以使用的标识符只能由小写字母a-z、大写字母A-Z、数字0-9、下划线和点组成(点的意思是查找:字典->属性->方法->列表索引)。
其实有至少四种方法可以实现你想要的效果:
- 通过预处理,把准备好的数据作为你模型的一个属性提供出来(或者说是其他什么东西)
- 把数据作为你模型的一个方法提供,并确保这个方法除了
self
之外不需要其他参数 在视图中填充模型实例
for newsletter in newsletters: setattr(newsletter, 'basepath', newsletter.NewsletterPath.split('/')[-1])
(或者类似的做法)
- 实现一个自定义过滤器标签,来处理分割(其实比你想的要简单)