Django模板中的for循环是否允许使用range()函数?

9
我正在尝试在我的模板中使用一个for循环,但是出现了错误。
这是Jinja的代码:
{% for i in range(1,10) %}
    <h2>{{i}}</h2>
{% endfor %}

这里是错误信息:
django.template.exceptions.TemplateSyntaxError: 无法解析剩余部分:'(1,10)',来自 'range(1,10)'
我有点困惑。这表明在 range 函数中有问题,甚至可能不存在,但我在其他 Stack Overflow 的帖子中看到它被建议作为解决方案,比如这个: 如何在 Jinja2 中模拟 while 循环 Jinja/Django 中是否存在 range 函数?如果存在,为什么它不起作用,如果不存在,有什么更好的替代方法?

Jinja确实支持range(),但Django模板语言不是Jinja。 - djvg
1
这个回答解决了你的问题吗?Django模板中的数字for循环 - djvg
4个回答

10

我不认为有官方解决方案。但是有一些变通方法。

在模板中可以使用以下内容,其中的“a”将是您想循环的数字。

{% for x in "aa" %}
   ...
{% endfor %}

另一个解决方案是创建一个自定义模板过滤器,您可以给它一个数字然后它会返回:
range(x)

我能想到的最后一个选项是:
render_response('template.html', {'range': range(10))

然后执行:
{% for x in range %}
   ...
 {% endfor %}

3

首先,Django模板中没有range标签或函数。

解决方法- 将列表传递给render函数。

你的问题是这个:

{% for i in range(1,10) %}
    <h2>{{i}}</h2>
{% endfor %}

通过在views.py中传递range函数作为生成器来替换它

context={
'iterator':range(1,10)
}
return render(req,'anyname.html',context)

接下来在您的模板中可以使用以下方式:

{% for i in iterator %}
   <div> {{i}} </div>
{% endfor %}

1
在Django 3.*中为我工作。 - Tomy

2
在Python中,可以使用for循环迭代字符串。
例如:
for ch in '0123456789':
    print(ch)

或者,在Django中:
{% for ch in '0123456789' %}
    <h2>{{ch}}</h2>
{% endfor %}

0
其他答案建议以下之一:
- 在视图中创建范围,然后将其传递到模板上下文中 - 创建一个自定义的模板过滤器(或标签),返回该范围 - 遍历一个固定长度的字符串
然而,我们也可以直接在模板中通过遍历一个变长字符串来模拟`range()`函数,使用内置的模板过滤器之一,即`ljust``rjust``center`
{% for _ in ''|ljust:number %}
    {{ forloop.counter }}
{% endfor %}

这个循环遍历一个长度为number的虚拟字符串。

实际的循环索引,即 OP 的i,可以通过forloop.counterforloop.counter0获得。

对于起始索引不是10的情况,你可以在循环内部使用if条件。

编辑:

事实证明这里已经有很多类似的解决方案:Django模板中的数字for循环


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接