如何在 Django 模板中调用带有参数的函数?

问题描述 投票:0回答:6

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

{% for item in my_func(10) %} 

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

有什么正常的方法吗?

python django function variables django-templates
6个回答
98
投票

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


30
投票

如果您有一个对象,您可以将其定义为

@property
,这样您无需调用即可获得结果,例如

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

然后在模板中:

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

14
投票

根据设计,Django 模板无法调用任意 Python 代码。对于设计人员编写模板的环境来说,这是一项安全保障功能,并且还可以防止业务逻辑迁移到模板中。

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


12
投票

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

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


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

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


3
投票

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

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>

0
投票

创建自定义模板过滤器(

应用程序名称/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 %}
© www.soinside.com 2019 - 2024. All rights reserved.