【发布时间】:2010-11-09 14:44:27
【问题描述】:
如何在 Django 模板中编写数字 for 循环?我的意思是像
for i = 1 to n
【问题讨论】:
如何在 Django 模板中编写数字 for 循环?我的意思是像
for i = 1 to n
【问题讨论】:
我只是把流行的答案更进一步,让它更健壮。这使您可以指定任何起点,例如 0 或 1。它还使用了 python 的范围功能,其中 end 少了一个,因此它可以直接与列表长度一起使用。
@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 或硬编码。添加一个步骤需要一个模板标签,这应该涵盖更多用例,所以这是一个进步。
【讨论】:
您可以在views.py 的上下文中传递range(n) 而不是n。这将为您提供一个可迭代的列表。
context['range']= range(n)
然后你可以这样迭代你的模板:
{% for i in range %}
<!-- your code -->
{% endfor %}
【讨论】:
我对这个问题的看法,我认为是最 Pythonic 的。在您的应用程序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 []。这样它就不会引发错误并返回一个空数组(类似于大多数模板函数的工作方式)。
{% for _ in ''|center:13 %}
{{ forloop.counter }}
{% endfor %}
【讨论】:
这显示了 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 %}
【讨论】:
对于那些寻求简单答案的人,只需要显示一定数量的值,例如 100 个帖子中的 3 个,只需添加 {% for post in posts|slice:"3" %} 并正常循环,只会添加 3 个帖子。
【讨论】:
{% for i in range(10) %}
{{ i }}
{% endfor %}
【讨论】:
(10) from range(10)
我使用了一种简单的技术,可以很好地适用于没有特殊标签和额外上下文的小案例。有时这会派上用场
{% for i in '0123456789'|make_list %}
{{ forloop.counter }}
{% endfor %}
【讨论】:
context={'iterateover': range(x)} 也能正常工作
{% for i in "x"|rjust:"100" %}
你可以通过:
{ 'n' : range(n) }
使用模板:
{% for i in n %} ... {% endfor %}
【讨论】:
这本质上需要一个range 函数。为此提出了 Django 功能票 (https://code.djangoproject.com/ticket/13088),但由于“无法修复”而关闭,并附有以下评论。
我对这个想法的印象是,它试图导致在模板中编程。如果你有一个需要渲染的选项列表,它们应该在视图中计算,而不是在模板中。如果这就像一系列值一样简单,那就这样吧。
他们有一个很好的观点 - 模板应该是视图的非常简单的表示。您应该在视图中创建有限的所需数据并在上下文中传递给模板。
【讨论】:
您可以使用:
{% with ''|center: i as range %}
【讨论】:
我在这个问题上非常努力,我在这里找到了最好的答案: (来自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 %}
【讨论】:
context['loop_times'] = range(1, 8)。如果可能的话,给出整个代码
你可以传递一个绑定
{'n' : range(n) }
到模板,然后做
{% for i in n %}
...
{% endfor %}
请注意,您将获得基于 0 的行为 (0, 1, ... n-1)。
(为兼容 Python3 而更新)
【讨论】:
range(n),如果我没记错的话,xrange 已被弃用
此方法支持标准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))
可能是这样的?
{% for i in "x"|rjust:"100" %}
...
{% endfor %}
【讨论】:
{% with ''|center:n as range %}
{% for _ in range %}
{{ forloop.counter }}
{% endfor %}
{% endwith %}
【讨论】:
您应该在模板中使用“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>
【讨论】:
如果数字来自模型,我发现这是模型的一个很好的补丁:
def iterableQuantity(self):
return range(self.quantity)
【讨论】:
以防万一其他人遇到这个问题……我创建了一个模板标签,可让您创建 range(...): http://www.djangosnippets.org/snippets/1926/
【讨论】:
您不传递n 本身,而是传递range(n) [包括从0 到n-1 的整数列表],从您的视图到您的模板,在后者中您传递{% for i in therange %}(如果您绝对坚持使用基于 1 而不是正常的基于 0 的索引,您可以在循环体中使用 forloop.counter;-)。
【讨论】:
不幸的是,这是 Django 模板语言中的not supported。 suggestions 中有一个couple,但它们看起来有点复杂。我只想在上下文中放置一个变量:
...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...
在模板中:
{% for i in range %}
...
{% endfor %}
【讨论】:
clear_full_page_cache() 时(在 php/magento 商店中看到,需要相当长的时间来调试)。最后,让服务器渲染它不是很明智,当客户端可以简单且便宜地完成时,因为没有数据与之关联(否则您只需迭代数据)。