Django模板中的数字for循环

我如何写一个数字for循环在Django模板?我的意思是

for i = 1 to n
310287 次浏览

你不传递n本身,而是传递range(n)[包含从0到n-1的整数列表],从你的视图传递到你的模板,在后者中你会传递{% for i in therange %}(如果你绝对坚持以1为基础而不是以0为基础的普通索引,你可以在循环体中使用forloop.counter;-)。

的绑定

{'n' : range(n) }

到模板,然后做

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

注意,您将得到基于0的行为(0,1,…)n - 1)。

(为兼容Python3而更新)

不幸的是,这是Django模板语言中的不支持。有建议夫妇,但它们看起来有点复杂。我只要在上下文中放一个变量:

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

在模板中:

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

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

Accepts the same arguments as the 'range' builtin and creates a list containing
the result of 'range'.


Syntax:
{% mkrange [start,] stop[, step] as context_name %}


For example:
{% mkrange 5 10 2 as some_range %}
{% for i in some_range %}
\{\{ i }}: Something I want to repeat\n
{% endfor %}


Produces:
5: Something I want to repeat
7: Something I want to repeat
9: Something I want to repeat


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

def iterableQuantity(self):
return range(self.quantity)

我使用了一种简单的技术,可以很好地处理没有特殊标记和附加上下文的小情况。有时这很有用

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

你应该在模板中使用"",一个这样的例子:

在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>

我对这个问题的看法,我认为是最蟒蛇的。在app的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 %}
{% with ''|center:n as range %}
{% for _ in range %}
\{\{ forloop.counter }}
{% endfor %}
{% endwith %}

也许像这样?

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

此方法支持标准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>
我在这个问题上很努力,我在这里找到了最好的答案: (从如何在django模板中循环7次) < / p >

你甚至可以访问idx!

views.py:

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

html:

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

我只是把流行的答案做得更深入一些,让它更健壮。这允许您指定任何起点,例如0或1。它还使用了python的range特性,其中末尾少了一个,因此可以直接与列表长度一起使用。

@register.filter(name='range')
def filter_range(start, end):
return range(start, end)

然后在你的模板中只包括上面的模板标签文件,并使用以下:

{% load myapp_filters %}


{% for c in 1|range:6 %}
\{\{ c }}
{% endfor %}

现在你可以用1-6代替0-6或者硬编码。添加一个步骤将需要一个模板标签,这应该涵盖更多的用例,所以这是向前迈出的一步。

可以使用: {% with ''|center: i as range %} < / p >

这本质上需要一个range函数。Django会因此引发一个功能票(https://code.djangoproject.com/ticket/13088),但会用下面的注释关闭为“won't fix”。

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

他们有一个很好的观点——模板应该是视图的非常简单的表示。您应该在视图中创建有限的必需数据,并将其传递给上下文中的模板。

你可以通过:

{'n':范围(n)}

使用模板:

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

. {% endfor %}

. {% endfor %
{% for i in range(10) %}
\{\{ i }}


{% endfor %}

对于那些寻找简单答案的人,只需要显示一个数值的数量,比如从100个帖子中选择3个,只添加{% for post in posts|slice:"3" %}并正常循环,只会添加3个帖子。

显示1到20个数字:

{% for i in "x"|rjust:"20"|make_list %}
\{\{ forloop.counter }}
{% endfor %}

这也可以帮助你: (count_all_slider_objects来自视图)

{% for i in "x"|rjust:count_all_slider_objects %}
\{\{ forloop.counter }}
{% endfor %}

  {% with counter=count_all_slider_objects %}
{% if list_all_slider_objects %}
{%  for slide in list_all_slider_objects %}
\{\{forloop.counter|add:"-1"}}
{% endfor%}
{% endif %}
{% endwith %}
{% for _ in ''|center:13 %}
\{\{ forloop.counter }}
{% endfor %}

你可以在views.py的上下文中传递range(n)而不是n。这将给你一个可迭代的列表。

context['range']= range(n)

然后你可以这样迭代你的模板:

{% for i in range %}
<!-- your code -->
{% endfor %}