我向 Django 模板传递一个函数,该函数返回一些记录。 我想调用这个函数并迭代它的结果。
{% for item in my_func(10) %}
那是行不通的。 我尝试将函数的返回值设置为变量并迭代该变量,但似乎无法在 Django 模板中设置变量。
有什么正常的方法吗?
您不能调用需要模板中参数的函数。 编写模板标签或过滤器。
如果您有一个对象,您可以将其定义为
@property
,这样您无需调用即可获得结果,例如
class Item:
@property
def results(self):
return something
然后在模板中:
<% for result in item.results %>
...
<% endfor %>
根据设计,Django 模板无法调用任意 Python 代码。对于设计人员编写模板的环境来说,这是一项安全保障功能,并且还可以防止业务逻辑迁移到模板中。
如果您想这样做,您可以切换到使用 Jinja2 模板 (http://jinja.pocoo.org/docs/),或您喜欢的任何其他支持此功能的模板系统。 django 的任何其他部分都不会受到您使用的模板的影响,因为它是一个单向过程。如果您愿意,您甚至可以在同一个项目中使用许多不同的模板系统。
我向 Django 模板传递一个函数,它返回一些记录
为什么不将存储函数返回值的变量而不是函数传递给 Django 模板?
我尝试将函数的返回值设置为变量并迭代变量,但似乎无法在 Django 模板中设置变量。
您应该在 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>
创建自定义模板过滤器(源)
应用程序名称/templatetags/app_name_tags.py:
from django import template
register = template.Library()
@register.filter
def my_func(num):
return [i for i in range(num)] # for example
html 文件:
{% load app_name_tags %}
{% for item in 10|my_func %}
{{item}}...
{% endfor %}