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)