【问题标题】:django template to populate bootstrap rows and columns用于填充引导行和列的 django 模板
【发布时间】:2013-12-17 01:22:12
【问题描述】:

所以这是我的问题:我有一堆类的实例。我想要一张这些实例对象的表格,这样每行最多有六个。在引导术语中,我希望每个对象都由类“span2”的“div”中的缩略图表示。

我最初的冲动是使用嵌套的 for 循环,但我在模板中操作索引变量时遇到了麻烦,而且我不知道如何在模板之外执行此操作。

这通常是我想要弄清楚的 python/django 模板/伪代码。

queryset = Class.objects.all()
set_length = queryset.count()

num_rows = set_length/6 
#because I want 6 columns in each row, each with one instance

set_as_list = list(queryset) 
# have a list so I can iterate through objects by index

for i in range(table_rows):
    # make a row
    <div class="row">
    for j in range (i*6,(i+1)*6):
        #make six or less columns
        <div class="span2">
           <p>set_as_list[j].attribute1</p>
           <p>set_as_list[j].attribute2</p>
        </div>
    </div> # end row

我希望这种 django 模板语言、python 和 html 的公然混合不会太冒犯任何人。只是试图表达我正在尝试做的事情的想法。如果有人愿意提供任何帮助,我将不胜感激,因为我已经为此苦苦挣扎了好几天,并且在模板内外都在寻找解决方案。

我也意识到在整数除法之后需要有一个包含剩余对象的最后一行。

【问题讨论】:

    标签: django templates twitter-bootstrap tags


    【解决方案1】:

    没有时间解释,但我遇到了类似的问题,直到我关闭此浏览器页面,这里是一个解决方案

    {% for sub_article in articles %}
        {% if forloop.first %}<div class="row">{% endif %}
        <div class="col-xs-4">
                <a href="#">
                    {{ sub_article.name }}
                </a>
            </div>
        {% if forloop.counter|divisibleby:3 %}</div><div class="row">{% endif %}
        {% if forloop.last %}</div>{% endif %}
    {% endfor %}
    

    【讨论】:

    • 列改变大小的任何解决方案?例如,如果您从 col-md-4 转到 col-sm-6,当屏幕尺寸发生变化时,它需要在可被 2 整除的行中。
    • 在查找了我之前评论的最佳解决方案后,我使用 bootstrap .clearfix 类
    • 这是一个很好的答案,但是当由于不同的设备大小而有不同的列数时,如何实现它.. col-md-4 col-sm-6 col-xs-12 也许添加逻辑除以其他数字,然后添加整理标签。
    • @TzviGregoryKaidanov 在这种情况下除以总列的 LCM。例如col-md-4每行显示3列,col-sm-6每行显示2列,col-xs-12每行显示1列,3、2和1的LCM为6。所以使用divisibleby:6。同样,如果您有 col-md-3(一行 4 列)和 col-sm-6(一行 2 列),您将使用 divisibleby:4,因为 4 和 2 的 LCM 是 4。(我知道这个评论是三个晚了几年,但我为其他人添加了这个寻找答案)。
    • @xyres 我认为他的意思是响应?并不是说你改变循环中的整除数
    【解决方案2】:

    由于 forloop.counter 以 1 开始索引,因此除以 3 不起作用。 所以请改用 forloop.counter0。

    <div class="row">
    {% for product in all_products %}
        {% if forloop.counter0|divisibleby:3 %}
            </div><br><div class="row">
        {% endif %}
            <div class="col-4"></div>
    {% endfor %}
    

    【讨论】:

    • 每第 n 次迭代插入一行,因此在您之间将获得不在该行中的元素
    【解决方案3】:

    可能为时已晚,但有simple solution如下

    <div class="container">
        <div class="row">
            {% for product in products %}
                {% if forloop.counter0|divisibleby:3 and not forloop.first %}<div class="w-100"></div>{% endif %}
                <div class="col">{{product.title}}</div>
            {% endfor %}
        </div>
    </div>
    

    【讨论】:

      【解决方案4】:

      我建议添加自定义标签as_chunk。我认为它使代码更漂亮,更具可读性。

      # app/templatetags/my_tags.py
      
      from math import ceil
      from django import template
      
      register = template.Library()
      
      @register.filter
      def as_chunks(lst, chunk_size):
          limit = ceil(len(lst) / chunk_size)
          for idx in range(limit):
              yield lst[chunk_size * idx : chunk_size * (idx + 1)]
      
      
      # app/templates/your-template.html
      
      {% load my_tags %}
      
      ...
      
      {% for chunk in elements|as_chunk:6 %}
        <div class="row">
          {% for element in chunk %}
            <div class="col-2">
              {{ element.name }}
            </div>
          {% endfor %}
        </div>
      {% endfor %}
      
      ...
      

      【讨论】:

      • 超级有用的答案IMO,并从模板中取出逻辑。此外,不会用不必要的逻辑使视图超载。不错的中间地带。
      【解决方案5】:

      您可以使代码更通用一点。逻辑如下:

      queryset = Class.objects.all()
      set_length = queryset.count()
      
      <div class="row">
      {% for i in queryset %}
          <div class="span2">
              <p>i.attr</p>
              <p>i.attr</p>
          </div>
          {% if forloop.counter|divisibleby:"6" or forloop.last %}
              </div> <!--end row-->
          {% endif %}
      {% endfor %}
      

      我希望这能解决你的问题:-)

      【讨论】:

      • Arpit,谢谢您的回答!唯一的问题是,据我所知,这段代码只写了一行。您将如何调整此代码以生成所需的行数?
      • 其实我觉得这可能是重复的。我认为这篇文章有解决方案:stackoverflow.com/questions/16450124/…
      • 是的,已确认。上面的链接解决了这个问题。它使用了一个辅助函数,这样我们就可以遍历每行六个块。
      • 几乎在 for 循环的开头尝试 {% if forloop.counter|divisibleby:"6" 或 forloop.first %}
        {% endif %}。
      猜你喜欢
      • 2019-03-02
      • 2019-04-13
      • 2016-09-02
      • 2015-03-15
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2014-11-10
      • 2012-03-03
      相关资源
      最近更新 更多