Django模板中的循环数字
如何在Django模板中编写循环数字? 我的意思是这样的
for i = 1 to n
我已经使用了一个简单的技术,很好地适用于没有特殊标签,没有附加上下文的小案例。 有时这个派上用场
{% for i in "xxxxxxxxxxxxxxxxxxxx" %} {{ forloop.counter0 }} {% endfor %}
根据需要调整“xxxxxxxxxxxxxxxxxxxx”的长度。 “xxx”只做3次迭代等
不幸的是,这在Django模板语言中不被支持 。 有几个 建议 ,但他们似乎有点复杂。 我只是在上下文中添加一个变量:
... render_to_response('foo.html', {..., 'range': range(10), ...}, ...) ...
并在模板中:
{% for i in range %} ... {% endfor %}
{% with ''|center:n as range %} {% for _ in range %} {{ forloop.counter }} {% endfor %} {% endwith %}
我认为这个问题是最好的。 我在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 %}
你可以传递一个绑定
{'n' : range(n) }
到模板,然后做
{% for i in n %} ... {% endfor %}
请注意,您将得到基于0的行为(0,1,… n-1)。
(为Python3兼容性更新)
也许这样?
{% for i in "x"|rjust:"100" %} ... {% endfor %}
只要incase其他人遇到这个问题…我已经创建了一个模板标签,可以让你创建一个range(...)
: http : //www.djangosnippets.org/snippets/1926/
接受与“范围”内置相同的参数并创建一个包含的列表 范围的结果。 句法: {%mkrange [start,] stop [,step] as context_name%} 例如: {%mkrange 5 10 2 as some_range%} {为了我在some_range%} {{i}}:我想重复的东西\ n {%endfor%} 生产: 5:我想重复的东西 7:我想重复的东西 9:我想重复一些事情
你不会传递n
本身,而是range(n)
[从0到n-1的整数列表],从你的视图到你的模板,在后者,你做{% for i in therange %}
(如果你坚持基于1而不是基于0的索引,你可以在循环体内使用forloop.counter
;-)。
您应该在模板中使用“ 切片 ”,例如:
在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>
我在这个问题上非常努力,我在这里找到了最好的答案:(从如何在django模板中循环7次 )
你甚至可以访问idx!
views.py:
context['loop_times'] = range(1, 8)
HTML:
{% for i in loop_times %} <option value={{ i }}>{{ i }}</option> {% endfor %}
我只是进一步的流行答案,使其更强大。 这使您可以指定任何起点,例如0或1。 它也使用python的范围功能,最后的结果是少一个,所以它可以直接使用列表长度为例。
@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或硬编码。 添加一个步骤需要一个模板标签,这应该覆盖更多的用例,所以这是一个进步。
您可以使用: {% with ''|center: i as range %}
这基本上需要一个range
函数。 一个Django功能票据被提出( https://code.djangoproject.com/ticket/13088 ),但由于下面的评论被关闭为“不会修复”。
我对这个想法的印象是,它试图导致模板中的编程。 如果您有需要呈现的选项列表,则应在视图中计算它们,而不是在模板中计算。 如果这就像一系列的价值一样简单,那就这样吧。
他们有一个好点 – 模板应该是非常简单的视图表示。 您应该在视图中创建所需的有限数据,并在上下文中传递给模板。
如果数字来自模型,我发现这是模型的一个很好的补丁:
def iterableQuantity(self): return range(self.quantity)