2014-03-25 17 views
5

我正在使用一个类似于StackOverflow的主页来处理Django项目:它在单个主列中显示传入用户生成内容的片段。不过,我希望这些内容片段能够在填满主页的3行中显示(可以考虑[Pinterest插页板页面] [2]或网格布局博客)。如何使用带Bootstrap的Django跨网格显示动态内容?

我正在使用Bootstrap的网格系统,但意识到我不知道Python/Django模板魔术+ Bootstrap的正确组合,以获取传入的内容来填充网格。有人能为我解释这一点吗?

我想...

  {% for question in questions.paginator.page %} 
      {% question_list_item question %} 
      {% endfor %} 

...有

<div class="container"> 
    <div class="row clearfix"> 
      <div class="col-md-4"> 
       item 1 
      </div> 
      <div class="col-md-4"> 
       item 2 
      </div> 
      <div class="col-md-4"> 
       item 3 
      </div> 
    </div> 
    <div class="row clearfix"> 
      <div class="col-md-4"> 
       item 1 
      </div> 
      <div class="col-md-4"> 
       item 2 
      </div> 
      <div class="col-md-4"> 
       item 3 
      </div> 
    </div> 
</div> 

更新的重复效果:我能得到这个工作(一点点列数响应性变化)使用以下内容,但我是初学者,所以请让我知道是否有更好的解决方案。

    <div class="row"> 
         {% for question in questions.paginator.page %} 
         <div class="col-lg-3 col-sm-6 col-xs-12"> 
          {% question_list_item question %} 
         </div> 
         {% if forloop.counter|divisibleby:4 %} 
        </div> 
        <div class="row"> 
         {% endif %} 
         {% endfor %} 
        </div> 

谢谢!

+0

可以发布你的'models.py'的代码吗? – xyres

+0

您也可以将所有问题都放在一行中。仅仅因为在单个容器中不超过12个列彼此相邻放置,浮动将换行到新行。 – Tino

+0

看起来像一样的东西(forloop.counter | divisibleby)在这里推荐:http:// stackoverflow。com/a/21625264/317110 –

回答

0

最简单的情况是,如果您有两个单独的用户提供的信息需要分成两列;那么你可以这样做:

<div class="container"> 
    <div class="row"> 
    <div class="col-sm-6"> 
     {{ usercontent.thing_a }} 
    </div> 
    <div class="col-sm-6"> 
     {{ usercontent.thing_b }} 
    </div> 
    </div> 
</div> 

如果用户在一个大的整块进入的东西,你需要弄清楚如何哟想拆它 - 有文本您可以将某些标记使用分成两块,然后像上面那样做?如果是这样,你可以用Python的split分割它或使用正则表达式。

或者这是正在运行的文本,就像文章的正文一样,并且您希望它分成两半?如果是后一种情况,我会将文本显示在一个Bootstrap列中,但使用CSS3的“列”属性显示为两列。

+0

啊,我认为使用'多列'这个词时,我的意思是'行'是不必要的混淆。对于那个很抱歉。我实际上并不想为每列添加不同的信息,但在网格中填充相同的字符串(想象一下,如果Twitter在Pinterest版块的所有框中显示推文,而不是在单列时间轴上显示)。我认为我想要的解决方案似乎涉及{%cycle ...或{%if forloop ... ...但我无法自己弄清楚。如果这有帮助,我在我的问题中添加了更多信息。非常感谢! – Morgan

0

作为一种替代方案,您可以使用JavaScript Grid,在客户端渲染,如Shield UI Grid widget。您甚至可以将其绑定到服务器端API以检索数据并执行其他操作,如编辑,删除,排序,分组等。

完整的教程和源代码可以看到here

0

参见如何使用分页与基于类的列表视图(Django的&引导)该资源: https://simpleisbetterthancomplex.com/tutorial/2016/08/03/how-to-paginate-with-django.html

views.py

from django.views import generic 
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 
from questions.models import Question 

class QuestionListView(generic.ListView): 
    model = Question 
    template_name = 'your_app_name/questions.html' 
    context_object_name = 'questions' 
    paginate_by = 10 
    queryset = Question.objects.all() 

questions.html

<table class="table table-bordered"> 
<thead> 
<tr> 
    <th>Item</th> 
    <th>Tag</th> 
    <th>Date</th> 
</tr> 
</thead> 
<tbody> 
{% for question in questions %} 
    <tr> 
    <td>{{ question.item }}</td> 
    <td>{{ question.tag }}</td> 
    <td>{{ question.date }}</td> 
    </tr> 
{% endfor %} 
</tbody> 
</table> 

{% if is_paginated %} 
<ul class="pagination"> 
{% if page_obj.has_previous %} 
    <li><a href="?page={{ page_obj.previous_page_number }}">&laquo;</a></li> 
{% else %} 
    <li class="disabled"><span>&laquo;</span></li> 
{% endif %} 
{% for i in paginator.page_range %} 
    {% if page_obj.number == i %} 
    <li class="active"><span>{{ i }} <span class="sr-only">(current)</span>  </span></li> 
    {% else %} 
    <li><a href="?page={{ i }}">{{ i }}</a></li> 
    {% endif %} 
{% endfor %} 
{% if page_obj.has_next %} 
    <li><a href="?page={{ page_obj.next_page_number }}">&raquo;</a></li> 
{% else %} 
    <li class="disabled"><span>&raquo;</span></li> 
{% endif %} 
</ul> 
{% endif %}