Frage

Gibt es eine gute Möglichkeit, die Aufzählung eines Querysets in zwei zu machen div Säulen?

Mit 960 Grid habe ich etwas zu dem Effekt von ...

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

In Django muss ein Modell in diesen Säulen und vorzugsweise etwas gleichermaßen etwas gleichmäßig aufgeschrieben werden. Im Moment habe ich einen hässlichen Code, der in der Ansicht den Queryset in 2 Hälften aufteilt und dann jede Hälfte in ihrer jeweiligen Spalte gerendert wird.

Es muss eine bessere Möglichkeit geben, dies zu tun, vorzugsweise nur das Vorlagenrendersystem?

Nur als Referenz, hier ist, wie es im Moment "funktioniert":

Ansichten.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:] }

template.html

<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>
War es hilfreich?

Lösung

Ich empfehle die Verwendung Django -Filter.

Django Snippets liefert a Partitionierungsvorlagenfilter, was Sie verwenden können:

{% 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>

Andere Tipps

  1. Dies ist die Aufgabe eines Rendering -Systems, nicht der Ansicht. Die Ansicht sollte nicht wissen, ob Sie 2, 3 oder 4 Spalten in Ihrer Vorlage anzeigen.
  2. Es ist immer besser, Standard -Django -Tags zu verwenden.

Verwenden Sie das Standard -Django -Vorlagen -Tag 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>

Es wird Ihre Liste [1 2 3 4 5 6] als angezeigt

1 2

3 4

5 6

Übrigens hat Jinja2 Template Engine batch und slice Filter, die den Trick machen. Ich bin zu Jinja2 gewechselt und habe nun keines dieser Probleme mit "wie man X mit schlechten Django -Tags und Filtern anzeigt".

Ich denke, Sie müssen Ihr eigenes Vorlagen -Tag erstellen, um Splits auf Abfragen zu machen. Ich würde so etwas tun.

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)

Bitte beachten Sie, dass ich diesen Code nicht getestet habe, daher kann er spektakulär fehlschlagen, aber er sollte Sie in die richtige Richtung zeigen, um das Zeug aus Ihrer Sicht zu räumen.

Hier ist eine kurze Lösung, die Bootstrap verwendet und keine Django -Filter benötigt

<div class="row">
    {% for sport in sports %}
        <div class="col-md-6">
            <!-- Blah Blah -->
        </div>
    {% endfor %}
</div>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top