Django模板中的数字for循环

问题描述 投票:235回答:17

如何在Django模板中编写数字for循环?我的意思是类似

for i = 1 to n
django django-templates
17个回答
370
投票

我使用了一种简单的技术,该技术非常适合没有特殊标签且没有其他上下文的小情况。有时候这很方便]

{% for i in '0123456789'|make_list %}
    {{ forloop.counter }}
{% endfor %}

7
投票

此方法支持标准range([start,] stop[, step])功能的所有功能

<app>/templatetags/range.py

from django import template

register = template.Library()


@register.filter(name='range')
def _range(_min, args=None):
    _max, _step = None, None
    if args:
        if not isinstance(args, int):
            _max, _step = map(int, args.split(','))
        else:
            _max = args
    args = filter(None, (_min, _max, _step))
    return range(*args)

用法:

{% load range %}

<p>stop 5
{% for value in 5|range %}
{{ value }}
{% endfor %}
</p>

<p>start 5 stop 10
{% for value in 5|range:10 %}
{{ value }}
{% endfor %}
</p>

<p>start 5 stop 10 step 2
{% for value in 5|range:"10,2" %}
{{ value }}
{% endfor %}
</p>

输出

<p>stop 5
0 1 2 3 4
</p>

<p>start 5 stop 10
5 6 7 8 9
</p>

<p>start 5 stop 10 step 2
5 7 9
</p>

7
投票

我在这个问题上非常努力,在这里找到了最佳答案:(来自how to loop 7 times in the django templates

您甚至可以访问idx!

views.py:

context['loop_times'] = range(1, 8)

html:

{% for i in loop_times %}
        <option value={{ i }}>{{ i }}</option>
{% endfor %}

5
投票

您可以通过:

{'n':range(n)}] >>

要使用模板:

{%for i in n%}...{%endfor%}


4
投票

我只是将流行的答案进一步扩展,使其更可靠。这使您可以指定任何起点,例如0或1。它还使用了python的range功能,其末尾少了一个,因此可以直接与列表长度一起使用。


3
投票

您可以使用:{% with ''|center: i as range %}


3
投票

这本质上需要range函数。为此,已筹集了一张Django功能票(https://code.djangoproject.com/ticket/13088),但已关闭,并带有以下注释,表示“无法修复”。

我对这个想法的印象是,它试图导致在模板中进行编程。如果您有需要呈现的选项列表,则应在视图中而不是模板中进行计算。如果那只是一个值范围那么简单,那就去吧。


0
投票

如果数字来自模型,我发现这是模型的一个很好的补丁:


0
投票
{% for i in range(10) %}
   {{ i }}

{% endfor %}

97
投票

[不幸的是,这是Django模板语言中的not supportedcouplesuggestions,但看起来有些复杂。我只是将变量放在上下文中:

...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...

并且在模板中:

{% for i in range %}
     ...
{% endfor %}

96
投票
{% with ''|center:n as range %}
{% for _ in range %}
    {{ forloop.counter }}
{% endfor %}
{% endwith %}

72
投票

我认为这个问题最好。我在templatetags目录中保留一个my_filters.py。

@register.filter(name='times') 
def times(number):
    return range(number)

您会这样使用:

{% load my_filters %}
{% for i in 15|times %}
    <li>Item</li>
{% endfor %}

38
投票

也许是这样?

{% for i in "x"|rjust:"100" %}
...
{% endfor %}

36
投票

您可以传递绑定

{'n' : range(n) }

转到模板,然后执行

{% for i in n %}
...
{% endfor %}

请注意,您将获得从0开始的行为(0,1,... n-1)。

(已更新,以兼容Python3)


9
投票

您不传递n本身,而是传递range(n) [包括从0到n-1的整数列表],从视图到模板,在模板中,您传递{% for i in therange %}(如果您绝对坚持使用基于1的索引,而不是基于常规基于0的索引,您可以在循环的正文中使用forloop.counter;-)。


9
投票

以防万一其他人遇到这个问题……我创建了一个模板标记,可让您创建一个range(...)http://www.djangosnippets.org/snippets/1926/

接受与“范围”内置参数相同的参数,并创建一个包含以下内容的列表“范围”的结果。句法:{%mkrange [start,] stop [,step] as context_name%}例如:{%mkrange 5 10 2 as some_range%}{%for some in range_%}{{i}}:我想重复的事\ n{%endfor%}产生:5:我想重复一遍7:我想重复一遍9:我想重复的事情

7
投票

您应该在模板中使用“ slice”,例如这样的示例:

在views.py

contexts = {
    'ALL_STORES': Store.objects.all(),
}

return render_to_response('store_list.html', contexts, RequestContext(request, processors=[custom_processor]))

在store_list.html中:

<ul>
{% for store in ALL_STORES|slice:":10" %}
    <li class="store_item">{{ store.name }}</li>
{% endfor %}
</ul>
© www.soinside.com 2019 - 2024. All rights reserved.