2009-06-07 11 views
3

Je délivrer en sortie une série de Django objets dans un modèle:Quelle flexibilité existe-t-il dans une boucle Django for?

{% for obj in list %} 
    ... 
{% endfor %} 

Mais je voudrais que la sortie les cinq premiers d'entre eux, puis mettre le reste dans le <DIV>. séparé L'idée étant, que je peux cacher la seconde moitié jusqu'à ce que nécessaire.

Je prévois quelque chose comme ça, mais il faut limiter les éléments itératifs:

{% for obj in list %} 
    ... 
{% endfor %} 

<a href="" onclick="unhide()">Show hidden</a> 
<div id="hidden"> 
    {% for obj in list %} 
     ... 
    {% endfor %} 
</div> 

Est-il possible de le faire dans le modèle seul? C'est la logique de présentation, donc je préfère ne pas polluer la vue.

Répondre

16

Vous pouvez utiliser slice:

{% for obj in list|slice:":5" %} 
    ... 
{% endfor %} 

<a href="" onclick="unhide()">Show hidden</a> 
<div id="hidden"> 
    {% for obj in list|slice:"5:" %} 
     ... 
    {% endfor %} 
</div> 
2

Bien sûr, vous pouvez par exemple faire la boucle deux fois et en son sein utiliser forloop.counter dans des contenants appropriés if constructions - la première fois seulement faire des choses quand il est <= 5, la deuxième fois seulement quand il est > 5 (rappelez-vous qu'il est de 1 à base - - Si vous voulez un 0, utilisez forloop.counter0 à la place).

7

Aux prises avec des limitations de modèle peut souvent être un signe que la vie est peut-être plus simple si vous avez plus de travail à votre avis:

context = { 
    'visible_list': mylist[:5], 
    'hidden_list': mylist[5:] 
} 

Je ne suis pas dire que cela est neccesarily mieux que la solution de filtre de tranche ci-dessus, mais il est souvent intéressant d'envisager de passer vos modèles d'un objet de contexte avec tout bien mis en place. Cela vous permet de vous adapter plus facilement si la logique devient encore plus complexe par la suite.

La logique de présentation est assez bien dans une vue. Je ne le vois pas particulièrement comme de la «pollution».

+1

Cette approche a l'avantage supplémentaire de rendre très facile l'ajout d'un conditionnel dans le modèle pour éviter d'afficher "Afficher caché" s'il n'y en a pas caché. –

Questions connexes