Answers:
我使用了一种简单的技术,该技术非常适合没有特殊标签且没有其他上下文的小情况。有时候这很方便
{% for i in '0123456789'|make_list %}
{{ forloop.counter }}
{% endfor %}
{% for i in "x"|rjust:"100" %}
{% with ''|center:n as range %}
{% for _ in range %}
{{ forloop.counter }}
{% endfor %}
{% endwith %}
不幸的是,Django模板语言不支持该功能。有一对夫妇 的建议,但他们似乎有点复杂。我只是将变量放在上下文中:
...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...
并在模板中:
{% for i in range %}
...
{% endfor %}
我对这个问题的看法是最好的。我在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 %}
range(1, 16)
让数从1开始,而不是0
from django.template import Library;register = Library()
@register.filter(name='range') def filter_range(start, end): return range(start, end)
然后用作{% for i in 1|range:6 %}{% endfor %}
。查看全部回答以下....
try: return range(number) except: return []
。这样,它永远不会引发错误并返回空数组(类似于大多数模板函数的工作方式)。
您可以通过绑定
{'n' : range(n) }
到模板,然后执行
{% for i in n %}
...
{% endfor %}
请注意,您将获得从0开始的行为(0,1,... n-1)。
(已更新,以实现Python3兼容性)
range(n)
在Python 3,如果我没有记错的话,x范围是不推荐它
以防万一其他人遇到这个问题……我创建了一个模板标记,可让您创建一个range(...)
:http : //www.djangosnippets.org/snippets/1926/
接受与“范围”内置参数相同的参数,并创建一个包含以下内容的列表 “范围”的结果。 句法: {%mkrange [start,] stop [,step] as context_name%} 例如: {%mkrange 5 10 2 as some_range%} {%for some inrange_range} {{i}}:我想重复的\ n {%endfor%} 产生: 5:我想重复一遍 7:我想重复一遍 9:我想重复的事情
我在这个问题上非常努力,在这里找到了最佳答案:(从django模板中如何循环7次))
您甚至可以访问idx!
views.py:
context['loop_times'] = range(1, 8)
的HTML:
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
您可以通过:
{'n':range(n)}
使用模板:
{%for i in n%} ... {%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>
此方法支持标准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>
for value in 0|range:"10,2"
。您必须按以下步骤更改代码:args = filter(lambda x: isinstance(x, int) and x >= 0, (_min, _max, _step))
我只是进一步扩大了流行的答案,并使其更加可靠。这使您可以指定任何起点,例如0或1。它还使用python的range功能,其中末尾少了一个,因此可以直接用于列表长度。
@register.filter(name='range')
def filter_range(start, end):
return range(start, end)
然后在您的模板中,仅包含上面的模板标记文件并使用以下内容:
{% for c in 1|range:6 %}
{{ c }}
{% endfor %}
现在,您可以执行1-6而不是仅执行0-6或对其进行硬编码。添加一个步骤将需要一个模板标记,这应该涵盖更多的用例,因此这是向前迈出的一步。
这本质上需要一个range
功能。为此,提出了Django功能票证(https://code.djangoproject.com/ticket/13088),但由于“无法修复”而关闭,并带有以下注释。
我对这个想法的印象是,它试图导致在模板中进行编程。如果您有需要呈现的选项列表,则应在视图中而不是模板中进行计算。如果那只是一个值范围那么简单,那就去吧。
它们有一个优点-模板应该是视图的非常简单的表示形式。您应该在视图中创建所需的有限数据,并在上下文中传递给模板。
对于那些寻求简单答案的人,只需要显示一定数量的值,例如,假设100个帖子中有3个只是{% for post in posts|slice:"3" %}
正常添加和循环,则只会添加3个帖子。
如果数字来自模型,我发现这是模型的一个不错的补丁:
def iterableQuantity(self):
return range(self.quantity)