Lev*_*Lev 236 django django-templates
如何for
在Django模板中编写数字循环?我的意思是
for i = 1 to n
Run Code Online (Sandbox Code Playgroud)
Udi*_*Udi 371
我使用了一种简单的技术,适用于没有特殊标签且没有其他上下文的小案例.有时这会派上用场
{% for i in '0123456789'|make_list %}
{{ forloop.counter }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
小智 98
{% with ''|center:n as range %}
{% for _ in range %}
{{ forloop.counter }}
{% endfor %}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)
tgh*_*ghw 97
不幸的是,Django模板语言不支持.有一对夫妇 的建议,但他们似乎有点复杂.我只想在上下文中放一个变量:
...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...
Run Code Online (Sandbox Code Playgroud)
并在模板中:
{% for i in range %}
...
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
Gui*_*eba 72
我对这个问题的看法,我认为是最好的.我在templatetags目录中保留了my_filters.py.
@register.filter(name='times')
def times(number):
return range(number)
Run Code Online (Sandbox Code Playgroud)
你会这样使用:
{% load my_filters %}
{% for i in 15|times %}
<li>Item</li>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
小智 38
也许是这样的?
{% for i in "x"|rjust:"100" %}
...
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
Dav*_*ith 36
你可以通过绑定
{'n' : range(n) }
Run Code Online (Sandbox Code Playgroud)
到模板,然后做
{% for i in n %}
...
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
请注意,您将获得从0开始的行为(0,1,... n-1).
(针对Python3兼容性进行了更新)
你没有传递n
自己,而是range(n)
[从0到n-1的整数列表],从你的视图到你的模板,在后者你做{% for i in therange %}
(如果你绝对坚持从1而不是正常0)你可以forloop.counter
在循环体中使用的基于索引;-).
只是因为其他人遇到这个问题...我已经创建了一个模板标签,可以让你创建一个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
我只是将流行的答案更进一步并使其更加强大。这让您可以指定任何起点,例如 0 或 1。它还使用 python 的范围功能,其中末尾少一个,因此它可以直接与列表长度一起使用,例如。
@register.filter(name='range')
def filter_range(start, end):
return range(start, end)
Run Code Online (Sandbox Code Playgroud)
然后在您的模板中只包含上面的模板标记文件并使用以下内容:
{% for c in 1|range:6 %}
{{ c }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
现在你可以做 1-6 而不是 0-6 或硬编码。添加一个步骤需要一个模板标签,这应该涵盖更多的用例,所以这是向前迈出的一步。
小智 7
您应该在模板中使用" 切片 ",例如:
在views.py中
contexts = {
'ALL_STORES': Store.objects.all(),
}
return render_to_response('store_list.html', contexts, RequestContext(request, processors=[custom_processor]))
Run Code Online (Sandbox Code Playgroud)
在store_list.html中:
<ul>
{% for store in ALL_STORES|slice:":10" %}
<li class="store_item">{{ store.name }}</li>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)
此方法支持标准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)
Run Code Online (Sandbox Code Playgroud)
用法:
{% 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>
Run Code Online (Sandbox Code Playgroud)
产量
<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>
Run Code Online (Sandbox Code Playgroud)
我在这个问题上非常努力,我在这里找到了最好的答案:(从如何在django模板中循环7次)
你甚至可以访问idx!
views.py:
context['loop_times'] = range(1, 8)
Run Code Online (Sandbox Code Playgroud)
HTML:
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
这本质上需要一个range
函数。为此提出了 Django 功能票证(https://code.djangoproject.com/ticket/13088),但以“无法修复”而关闭,并附有以下评论。
我对这个想法的印象是它试图在模板中进行编程。如果你有一个需要渲染的选项列表,它们应该在视图中计算,而不是在模板中。如果这就像一系列值一样简单,那就这样吧。
他们有一个很好的观点 - 模板应该是非常简单的视图表示。您应该在视图中创建有限的必需数据并传递给上下文中的模板。