【问题标题】:How to call function that takes an argument in a Django template?如何在 Django 模板中调用带有参数的函数?
【发布时间】:2011-01-28 22:55:08
【问题描述】:

我正在向 Django 的模板传递一个函数,该函数返回一些记录。 我想调用这个函数并迭代它的结果。

{% for item in my_func(10) %} 

这行不通。 我试图将函数的返回值设置为变量并迭代变量,但似乎无法在 Django 模板中设置变量。

有什么正常的方法吗?

【问题讨论】:

    标签: python django function variables django-templates


    【解决方案1】:

    您不能在模板中调用需要参数的函数。 Write 模板标签或过滤器。

    【讨论】:

    • 很伤心。我想要一个更简单的方法。
    • 我觉得内置python@property的解决方案是更好的解决方案,当然要视情况而定。
    • 是的,但这并不能解决问题。如果函数不需要参数,Django 会自动调用它们。如果 myfunc 是不带参数的函数,则编写 {% for item in myfunc %} 等效于 for item in myfunc()。 django 唯一真正的限制是调用需要参数的函数,@property 无法解决这个问题(尽管您可以在模板中设置一些属性并将它们用作参数,但这也不是特别干净)跨度>
    • 这种悲伤正是我喜欢 React JSX 的原因。
    • @Andy 这是一个有建设性和有用的评论吗?...你在比较苹果和大象;或者你如何从 React 中调用 Django 内部函数? (我假设您使用 API,但这不再是这个问题的范围)
    【解决方案2】:

    我正在向 Django 的模板传递一个函数,它会返回一些记录

    为什么不将存储函数返回值的变量而不是函数传递给 Django 模板?


    我尝试将函数的返回值设置为变量并迭代变量,但似乎没有办法在 Django 模板中设置变量。

    您应该在 Django 视图而不是模板中设置变量,然后将它们传递给模板。

    【讨论】:

    • 这个函数返回一些记录,参数是它们的计数。我想从模板中控制这个值。
    • 如果你想让函数被惰性求值怎么办?例如如果需要,您希望结果可用,但又不想白白计算?我想我一直在写模板标签..
    【解决方案3】:

    根据设计,Django 模板不能调用任意 Python 代码。这是设计人员编写模板的环境的安全功能,它还可以防止业务逻辑迁移到模板中。

    如果您想这样做,您可以切换到使用 Jinja2 模板 (http://jinja.pocoo.org/docs/),或者您喜欢的任何其他支持此功能的模板系统。 django 的任何其他部分都不会受到您使用的模板的影响,因为它是有意的单向过程。如果您愿意,您甚至可以在同一个项目中使用许多不同的模板系统。

    【讨论】:

      【解决方案4】:

      如果你有一个对象,你可以将它定义为@property,这样你就可以在没有调用的情况下获得结果,例如

      class Item:
          @property
          def results(self):
              return something
      

      然后在模板中:

      <% for result in item.results %>
      ...
      <% endfor %>
      

      【讨论】:

      • 你有这个@sherpya的参考吗?
      • 不一样。数组中的东西可以是不同类别的项。
      • @property 不会改变模板中调用方法的任何内容。您可以删除它,模板示例仍然可以完全一样地工作。 Django 已经允许调用不带参数的方法。
      • @TimTisdall 不在回复时
      【解决方案5】:

      您可以做的是,将“函数”创建为另一个模板文件,然后包含该文件并将参数传递给它。

      index.html 内

      <h3> Latest Songs </h3>
      {% include "song_player_list.html" with songs=latest_songs %}
      

      song_player_list.html 里面

      <ul>
      {%  for song in songs %}
      <li>
      <div id='songtile'>
      <a href='/songs/download/{{song.id}}/'><i class='fa fa-cloud-download'></i>&nbsp;Download</a>
      
      </div>
      </li>
      {% endfor %}
      </ul>
      

      【讨论】:

      • 我如何控制{% include "song_player_list.html" with songs=latest_songs %} 仅在单击按钮时执行。我试图将它放在一个函数中,但Django template 每次加载页面时都会执行它。
      猜你喜欢
      • 2022-11-29
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2014-10-12
      • 2021-06-20
      • 2018-03-05
      相关资源
      最近更新 更多