Django模板中的循环数字

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)

  • 第三次,这个答案是**BAD*.不要使用它.使用模板标记并正确执行.我没有看到如何说答案是坏的,是否足以删除评论. (22认同)
  • {%for i in'0123456789'| make_list%}迭代所有10,而不是跳过0. (21认同)
  • FWIW,012 == 12,所以它只会循环超过1和2. (8认同)
  • 使用'rjust'生成一个任意长度的字符串`{%for i in"x"| rjust:"100"%} (6认同)
  • @Rebs这有什么不好的?当然它很hacky,但添加模板标签只是因为你需要在一个项目中循环一个小范围一次也不是一个很好的解决方案. (6认同)
  • 同意.他们应该建立这个. (2认同)
  • @tobltobs喜欢计算'x' (2认同)
  • 这个答案怎么会有这么多投票?我同意@Rebs,这是一个糟糕的主意... (2认同)
  • 这还不错,但是Django毫无意义的荒谬的有限模板系统却是。 (2认同)

小智 98

{% with ''|center:n as range %}
{% for _ in range %}
    {{ forloop.counter }}
{% endfor %}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.因为中心创建了一个由n个空格组成的字符串然后循环播放.然后忽略每个空格char,但可以从forloop.counter(或forloop.counter0)中找到范围中的当前值.请参阅https://docs.djangoproject.com/en/dev/ref/templates/builtins/#center (8认同)

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)

  • Django作者在模板中禁用普通蟒蛇的动机似乎毫无意义且无关紧要,相比于在没有它的情况下工作所带来的痛苦和失去的时间,更不用说在一个非常棒的时候需要发明一个全新的语言(python! )已经就在那里! (10认同)
  • @Bogatyr 如果这就是您想要的,只需使用 Jinja2:https://docs.djangoproject.com/en/1.9/topics/templates/#django.template.backends.jinja2.Jinja2 (2认同)

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)

  • 还在 templatetags 目录中创建一个空文件 __init__.py。还将这些行添加到 my_filters.py `from django.template import Library;register = Library()` 的顶部 (3认同)
  • 我认为这是正确的解决方案。执行 `range(1, 16)` 以获取从 1 开始的数字,而不是从 0 开始。 (2认同)
  • 添加第二个过滤器参数,您将获得 Python 中内置的全范围函数。`@register.filter(name='range') def filter_range(start, end): return range(start, end)` 然后用作 `{% for i in 1|range:6 %}{% endfor %} `。请参阅下面的完整答案...... (2认同)
  • 我稍微改变了这一点(请原谅格式):“尝试:返回范围(数字),除了:返回[]”。这样它就不会引发错误并返回空数组(类似于大多数模板函数的工作方式)。 (2认同)

小智 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兼容性进行了更新)


Ale*_*lli 9

你没有传递n自己,而是range(n)[从0到n-1的整数列表],从你的视图到你的模板,在后者你做{% for i in therange %}(如果你绝对坚持从1而不是正常0)你可以forloop.counter在循环体中使用的基于索引;-).


Dav*_*ver 9

只是因为其他人遇到这个问题...我已经创建了一个模板标签,可以让你创建一个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


Pau*_*ora 8

我只是将流行的答案更进一步并使其更加强大。这让您可以指定任何起点,例如 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)

  • 不确定这是否是OP想要的,但这正是我想要的。=) (2认同)

Reb*_*ebs 7

此方法支持标准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)


KKl*_*ala 7

我在这个问题上非常努力,我在这里找到了最好的答案:(从如何在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)


小智 6

您可以通过:

{'n':range(n)}

使用模板:

{%for i in n%} ... {%endfor%}


Ala*_*ack 5

这本质上需要一个range函数。为此提出了 Django 功能票证(https://code.djangoproject.com/ticket/13088),但以“无法修复”而关闭,并附有以下评论。

我对这个想法的印象是它试图在模板中进行编程。如果你有一个需要渲染的选项列表,它们应该在视图中计算,而不是在模板中。如果这就像一系列值一样简单,那就这样吧。

他们有一个很好的观点 - 模板应该是非常简单的视图表示。您应该在视图中创建有限的必需数据并传递给上下文中的模板。

  • 视图应该用于数据,模板应该用于演示。视图不应该要求知道模板的内容,特别是范围。Django 忽略这些功能请求的理由是彻头彻尾的垃圾。 (7认同)