2010-01-22 95 views
7

里面Django模板我想呼吁模板变量之一的分割功能,然后得到最后一个元素,所以我做了这样的事情:调用Python函数在Django模板

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

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

+0

[Django模板调用函数]的可能重复(http://stackoverflow.com/questions/2468804/django-template-call-function) – Marcin 2013-07-27 21:28:36

回答

6

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

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

至少有四种方式来实现你想要什么:

  • 作出适当准备的数据可作为模型的属性(或者不管它是什么),通过预处理它
  • 化妆可作为模型的方法和数据确认,该方法没有必要的参数,除了self
  • 填充模型实例视图

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

    (或东西沿着这些线路)

  • 实现定制过滤器标签,将处理拆分(更容易,比你想象的)
7

django book

注意,不包括在方法调用的括号。 另外,无法将参数传递给方法; 您只能调用没有必需参数的方法。

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

4

模板故意不能做这样的事情。目的是防止您将业务逻辑放在模板中,这些模板仅用于处理布局。

所以一个可能的方法是在你的电子报模型中定义一个NewsletterPathLastElement(self)函数,然后从模板中调用它。

0

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

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