Domanda

C'è un buon modo per rendere l'enumerazione di un queryset in due colonne div ?

Usando la griglia 960, ho qualcosa per l'effetto di ...

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

In Django, un modello deve avere il contenuto elencato in entrambe le colonne, e preferibilmente in qualche modo allo stesso modo. Per il momento, ho del brutto codice che nella vista divide il QuerySet in 2 metà, e quindi ogni metà viene visualizzata nella rispettiva colonna.

Deve esserci un modo migliore per farlo, preferibilmente usando solo il sistema di rendering dei modelli?

Solo per riferimento, ecco come funziona " " al momento:

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

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>
È stato utile?

Soluzione

Consiglio di usare Filtri Django .

I frammenti di Django forniscono un filtro modello di partizionamento , che puoi usare come:

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

Altri suggerimenti

  1. Questo è il compito di un sistema di rendering, non di visualizzazione. La vista non dovrebbe sapere se verranno visualizzate 2, 3 o 4 colonne nel modello.
  2. È sempre meglio usare i tag Django predefiniti.

Usa il tag modello Django predefinito ciclo :

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

Verrà visualizzato il tuo elenco [1 2 3 4 5 6] come

1 2

3 4

5 6

A proposito, il motore di template di Jinja2 ha i filtri batch e slice che faranno il trucco. Sono passato a jinja2 e ora non ho nessuno di quei problemi su come visualizzare x usando tag e filtri di django scadenti "

Penso che dovrai creare il tuo tag template per dividere le query. Vorrei fare qualcosa del genere.

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)

Tieni presente che non ho ancora testato questo codice, quindi potrebbe fallire in modo spettacolare, ma dovrebbe indirizzarti verso la giusta direzione per far uscire quel materiale dalla tua vista.

Ecco una soluzione rapida che utilizza bootstrap e non necessita di filtri Django

<div class="row">
    {% for sport in sports %}
        <div class="col-md-6">
            <!-- Blah Blah -->
        </div>
    {% endfor %}
</div>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top