首页 文章

Django模板中的循环数字

提问于
浏览
194

如何在Django模板中编写数字 for 循环?我的意思是

for i = 1 to n

16 回答

  • 6

    也许是这样的?

    {% for i in "x"|rjust:"100" %}
    ...
    {% endfor %}
    
  • -2

    你可以通过绑定

    {'n' : range(n) }
    

    到模板,然后做

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

    请注意,您将获得基于0的行为(0,1,... n-1) .

    (针对Python3兼容性进行了更新)

  • 4
    {% with ''|center:n as range %}
    {% for _ in range %}
        {{ forloop.counter }}
    {% endfor %}
    {% endwith %}
    
  • 1

    这基本上需要 range 函数 . 为此创建了一个Django功能票证(https://code.djangoproject.com/ticket/13088),但以"won't fix"结束,并带有以下注释 .

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

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

  • 6

    如果数字来自模型,我发现这是该模型的一个很好的补丁:

    def iterableQuantity(self):
        return range(self.quantity)
    
  • 84

    我只是将流行的答案更进一步,使其更加强大 . 这允许您指定任何起点,例如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或硬编码 . 添加一个步骤需要一个模板标签,这应该涵盖更多用例,因此这是向前迈出的一步 .

  • 90

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

    You can pass :

    {'n':range(n)}

    To use template :

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

  • 34

    我在这个问题上非常努力,我在这里找到了最好的答案:(来自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 %}
    
  • 65

    您应该在模板中使用“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>
    
  • 331

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

  • 30

    您可以使用: {% with ''|center: i as range %}

  • 1

    我使用了一种简单的技术,适用于没有特殊标签且没有其他上下文的小案例 . 有时这会派上用场

    {% for i in "xxxxxxxxxxxxxxxxxxxx" %}
        {{ forloop.counter0 }}
    {% endfor %}
    

    根据您的需要调整“xxxxxxxxxxxxxxxxxxxx”的长度 . “xxx”只做3次迭代等 .

  • 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
    
  • 6

    我对这个问题的看法,我认为是最好的 . 我在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 %}
    
  • 9

    不幸的是,这是Django模板语言中的not supported . 有一个couplesuggestions,但它们看起来有点复杂 . 我只想在上下文中放一个变量:

    ...
    render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
    ...
    

    并在模板中:

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

相关问题