在Django模板中调用Python函数

时间:2010-01-22 08:09:20

标签: python django django-templates

在django模板中我试图在其中一个模板变量上调用split函数,然后获取最后一个元素,所以我做了类似这样的事情:

{{ newsletter.NewsletterPath.split('/').-1 }}

不幸的是,它不喜欢分裂。有些人可能会建议我在视图中进行拆分,但我不知道该怎么做,因为我需要为所有记录执行此操作。如果我能在模板中做到这一点会容易得多。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:7)

来自django book

  

请注意,方法调用中不包括括号。   此外,不可能将参数传递给方法;     你只能调用没有必要参数的方法。

所以,如果你想调用一个没有模板参数的方法,那很好。   否则,您必须在视图中执行此操作。

答案 1 :(得分:6)

“你不喜欢分裂”是什么意思?它是如何表现出不喜欢的?

如果我没记错的话,你不能将任何参数传递给django模板中调用的方法,并且可以在模板中使用的标识符只能包含az,AZ,0-9,下划线和点(其中点表示查找:字典 - >属性 - >方法 - >列表索引)。

至少有四种方法可以达到你想要的效果:

  • 通过预处理将适当准备好的数据作为模型的属性(或其他任何属性)提供
  • 使数据可用作模型的方法,并确保除了self
  • 之外,该方法不需要任何必需的参数
  • 在视图中填充模型实例

     for newsletter in newsletters:
          setattr(newsletter, 'basepath',
                  newsletter.NewsletterPath.split('/')[-1])
    

    (或沿着这些方向的东西)

  • 实现自定义过滤器标记,它将处理拆分(比您想象的更容易)

答案 2 :(得分:5)

模板故意无法执行此类操作。目的是防止您将业务逻辑放在模板中,模板只用于处理布局。

因此,可行的方法是在简报模型中定义NewsletterPathLastElement(self)函数,并从模板中调用它。

答案 3 :(得分:0)

是的,正如其他人所说,你不应该真的在模板中这样做。

但是如果你愿意,那么你需要定义一个过滤器并将其加载到模板中并使用它。

相关问题