代码之家  ›  专栏  ›  技术社区  ›  The.Anti.9

在django模板中调用python函数

  •  7
  • The.Anti.9  · 技术社区  · 15 年前

    在django模板中,我试图对其中一个模板变量调用split函数,然后获取最后一个元素,所以我做了如下操作:

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

    不幸的是,它不喜欢分裂。有些人可能建议我在视图中进行拆分,但我不确定如何进行拆分,因为我需要对所有记录进行拆分。如果我能在模板里做的话就容易多了。有办法吗?

    4 回复  |  直到 7 年前
        1
  •  6
  •   shylent    15 年前

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

    如果我没记错的话,您不能将任何任意参数传递给从django模板调用的方法,并且可以在模板中使用的标识符只能由a-z、a-z、0-9、下划线和点组成(其中点表示查找:dictionary->attribute->method->列表索引)。

    至少有四种方法可以实现您的目标:

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

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

      (或类似的东西)

    • 实现一个自定义的过滤器标记,它将处理分割(比您想象的要简单)
        2
  •  7
  •   3lectrologos    7 年前

    django book :

    请注意,方法调用中不包含括号。 而且,不可能将参数传递给方法; 只能调用没有必需参数的方法。

    所以,如果你想调用一个没有模板参数的方法,那就没问题了。 否则,必须在视图中执行。

        3
  •  4
  •   Ofri Raviv    15 年前

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

    因此,一种可能的方法是在新闻稿模型中定义一个新闻稿PathLastElement(self)函数,并从模板中调用它。

        4
  •  0
  •   lprsd    15 年前

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

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