【发布时间】:2011-01-28 22:55:08
【问题描述】:
我正在向 Django 的模板传递一个函数,该函数返回一些记录。 我想调用这个函数并迭代它的结果。
{% for item in my_func(10) %}
这行不通。 我试图将函数的返回值设置为变量并迭代变量,但似乎无法在 Django 模板中设置变量。
有什么正常的方法吗?
【问题讨论】:
标签: python django function variables django-templates
我正在向 Django 的模板传递一个函数,该函数返回一些记录。 我想调用这个函数并迭代它的结果。
{% for item in my_func(10) %}
这行不通。 我试图将函数的返回值设置为变量并迭代变量,但似乎无法在 Django 模板中设置变量。
有什么正常的方法吗?
【问题讨论】:
标签: python django function variables django-templates
您不能在模板中调用需要参数的函数。 Write 模板标签或过滤器。
【讨论】:
@property的解决方案是更好的解决方案,当然要视情况而定。
{% for item in myfunc %} 等效于 for item in myfunc()。 django 唯一真正的限制是调用需要参数的函数,@property 无法解决这个问题(尽管您可以在模板中设置一些属性并将它们用作参数,但这也不是特别干净)跨度>
我正在向 Django 的模板传递一个函数,它会返回一些记录
为什么不将存储函数返回值的变量而不是函数传递给 Django 模板?
我尝试将函数的返回值设置为变量并迭代变量,但似乎没有办法在 Django 模板中设置变量。
您应该在 Django 视图而不是模板中设置变量,然后将它们传递给模板。
【讨论】:
根据设计,Django 模板不能调用任意 Python 代码。这是设计人员编写模板的环境的安全功能,它还可以防止业务逻辑迁移到模板中。
如果您想这样做,您可以切换到使用 Jinja2 模板 (http://jinja.pocoo.org/docs/),或者您喜欢的任何其他支持此功能的模板系统。 django 的任何其他部分都不会受到您使用的模板的影响,因为它是有意的单向过程。如果您愿意,您甚至可以在同一个项目中使用许多不同的模板系统。
【讨论】:
如果你有一个对象,你可以将它定义为@property,这样你就可以在没有调用的情况下获得结果,例如
class Item:
@property
def results(self):
return something
然后在模板中:
<% for result in item.results %>
...
<% endfor %>
【讨论】:
@property 不会改变模板中调用方法的任何内容。您可以删除它,模板示例仍然可以完全一样地工作。 Django 已经允许调用不带参数的方法。
您可以做的是,将“函数”创建为另一个模板文件,然后包含该文件并将参数传递给它。
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> Download</a>
</div>
</li>
{% endfor %}
</ul>
【讨论】:
{% include "song_player_list.html" with songs=latest_songs %} 仅在单击按钮时执行。我试图将它放在一个函数中,但Django template 每次加载页面时都会执行它。