代码之家  ›  专栏  ›  技术社区  ›  T. Stone

将一个查询集呈现为2个div列(django模板)

  •  14
  • T. Stone  · 技术社区  · 16 年前

    有没有一种好方法可以将查询集的枚举分成两部分 div 柱?

    使用960网格,我得到了一些效果。。。

    <div class="container_16">
        <div class="grid_8 alpha"></div>
        <div class="grid_8 omega"></div>
    </div>
    

    必须有更好的方法来做到这一点,最好只使用模板渲染系统?

    仅供参考,以下是它目前的“工作原理”:

    views.py

    @render_to('template.html')
    def main_athletics_page(request, *args, **kwargs):    
        sports = Sport.objects.all()
        half = sports.count() / 2
        return { 'sports_1' : sports[0:half], 'sports_2' : sports[half:] }
    

    <div class="grid_8 alpha">
        {% for sport in sports_1 %}
            <!-- Blah blah -->
        {% endfor %}
    </div>
    
    <div class="grid_8 omega">
        {% for sport in sports_2 %}
            <!-- Blah blah -->
        {% endfor %}
    </div>
    
    4 回复  |  直到 15 年前
        1
  •  16
  •   Pedro Rolo    12 年前

    我建议使用 Django filters

    Django代码段提供了 partitioning template filter ,您可以像这样使用:

    {% load listutil %}
    
    <div class="grid_8 alpha">
        {% for sport in sports|partition:"2"|first %}
            <!-- Blah Blah -->
        {% endfor %}
    </div>
    
    <div class="grid_8 omega">
        {% for sport in sports|partition:"2"|last %}
            <!-- Blah Blah -->
        {% endfor %}
    </div>
    
        2
  •  6
  •   MrKsn    11 年前
    1. 最好使用默认的Django标记。

    使用默认的Django模板标记 cycle :

    <table>
        {% for item in items %}
            {% cycle 'row' '' as row silent %}
            {% if row %}<tr>{% endif %}
                <td>
                    {{ item }}
                </td>
            {% if not row %}</tr>{% endif %}
        {% endfor %}
    </table>
    

    1 2

    3 4

    5 6

    顺便说一下,Jinja2模板引擎 batch slice 过滤器会起作用。我切换到jinja2,现在没有“如何使用糟糕的django标记和过滤器显示x”的问题

        3
  •  1
  •   emeryc    16 年前

    我认为您必须创建自己的模板标记来对查询进行拆分。我会做类似的事情。

    from django.template import Library, Node, TemplateSyntaxError
    from restaurants.forms import MenuItemForm
    
    class Split(Node):
        def __init__(self, queryset, split_count=2, basename=None):
            self.queryset_name = queryset
            self.split_count = split_count
            self.basename = basename if basename else queryset
    
        def render(self, context):
            qs = context[self.queryset_name]
            qs_break = len(qs)/self.split_count
            for x in xrange(0, self.split_count-1):
                context["%s_%i"%(self.basename, x+1)] = qs[qs_break*x:qs_break*(x+1)]
            context["%s_%i"%(self.basename, x+2)] = qs[qs_break*x+1:]
            return ''        
    
    
    
    def split(parser, token):
        """
        Call from template will be
        {% split <queryset> on <count> as <name> %}
        """
        tokens = token.split_contents()
        if len(tokens) > 6:
            raise TemplateSyntaxError("Too many Tokens")
        #Do various tests to make sure it's right.
        return Split(tokens[1], tokens[3], tokens[5])
    
    split = register.tag(split)
    

    请注意,我还没有实际测试过这段代码,所以它可能会失败得很惨,但它应该为您指出正确的方向,让您不再看这些东西。

        4
  •  -1
  •   Philip Southwell    12 年前

    这里有一个快速的解决方案,它使用引导,不需要Django过滤器

    <div class="row">
        {% for sport in sports %}
            <div class="col-md-6">
                <!-- Blah Blah -->
            </div>
        {% endfor %}
    </div>
    
    推荐文章