在Django模板中调用Python函数

The*_*i.9 7 python django django-templates

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

{{ newsletter.NewsletterPath.split('/').-1 }}
Run Code Online (Sandbox Code Playgroud)

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

3le*_*gos 7

来自django书:

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

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


shy*_*ent 6

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

如果我没记错的话,你不能将任何参数传递给方法,这些方法是从django模板中调用的,而且模板中可以使用的标识符只能包含az,AZ,0-9,下划线和点(其中点表示查找:dictionary-> attribute-> method-> list-index).

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

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

     for newsletter in newsletters:
          setattr(newsletter, 'basepath',
                  newsletter.NewsletterPath.split('/')[-1])
    
    Run Code Online (Sandbox Code Playgroud)

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

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


Ofr*_*viv 5

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

因此,一种可行的方法是在新闻通讯模型中定义一个NewsletterPathLastElement(self)函数,然后从模板中调用它。