2010-10-03 1 views
4

La superposition terminologique rend la recherche de réponses difficile pour celle-ci.Rupture de données dans plusieurs colonnes d'affichage avec Django

Je suis à la recherche de conseils sur la meilleure façon de mettre en œuvre un affichage multi-colonnes de mon QuerySet qui remplit chaque colonne de haut en bas sur les colonnes X. Cela signifie que le nombre d'éléments dans chaque colonne est égal au nombre de QuerySet divisé par X (nombre de colonnes). L'utilisation de Offset ne fonctionne pas car je souhaite que mes données se développent en 4 colonnes sans mettre à jour le décalage manuellement. Les flottants CSS fonctionnent visuellement, mais laissent les données dans le désordre.

Répondre

5

Quelque chose comme ça devrait fonctionner pour vous, passer le nombre de colonnes que columns au modèle:

{% for item in items %} 
    {% if forloop.first %}<div style="float:left;">{% endif %} 
    {{ item }} 
    {% if forloop.counter|divisibleby:columns %} 
     </div><div style="float:left"> 
    {% endif %} 
    {% if forloop.last %}</div>{% endif %}  
{% endfor %} 
<div style="clear:both;"></div> 
+0

Une petite note, le divisibleby est mal orthographié dans le code ci-dessus, pour ceux d'entre nous qui coupent et collent :) –

+0

@TechTeacherGirl: Merci, je l'ai corrigé. Il y a une bonne raison pour laquelle nous n'avons pas de vérificateur d'orthographe dans les IDE. ;) –

+0

Cela fonctionnera si au lieu de colonnes vous passez réellement le nombre de lignes dans une colonne, que vous pouvez précalculer dans la vue en divisant le nombre total d'éléments par le nombre de colonnes comme Kim a dit. – rslite

1

Il semble que la réponse de lazerscience est sur la bonne voie - mais je pense que l'OP veut que les données à trier les données par ordre alphabétique dans la colonne, puis recommencer en haut de la colonne suivante. Utiliser divisibleby: fonctionne pour casser la ligne après les éléments 'X', mais je pense que cela prendra un modèle plus complexe pour faire ce que l'OP veut.

Je ne sais pas s'il est possible, mais la vue pourrait vous: Obtenez nombre d'éléments, diviser par « colonnes » et utilisées que # dans divisiblePar de percer dans la colonne suivante DIV (le flux visuel sera CSS)

Comme l'exemple de Lazers est maintenant que vous construisez des lignes et ensuite le diviser en colonnes, laissant l'ordre de tri à travers et puis vers le bas. Désolé si j'ai manqué quelque chose.

-K

+0

Mon exemple trie les éléments dans les colonnes, et ALORS commence la colonne suivante, il construirait d'abord une rangée f que vous mettriez chaque élément unique dans son propre div flottant! –

+0

Je vois, vous avez raison. Mais vous définissez toujours le nombre d'éléments dans la colonne, et non le nombre de colonnes. Pour l'affichage, ce n'est pas très utile, car une liste passe de 10 à 200 éléments, le nombre de colonnes devient absurde sauf si vous mettez manuellement à jour le divisibleby: #.Au lieu de cela, il serait utile de dire que je peux ajuster 3 colonnes dans ma conception, diviser l'ensemble de données en trois morceaux (1-10, 11-20, 21-30 pour une liste de 30 éléments) et calculer le compte de chaque colonne sur le voler (1/3rd du jeu de requête) – Kim

0

Vous feriez mieux d'aller et utiliser un plugin jQuery pour faire quelques colonnes dans une liste.
Columnizer fonctionne très bien pour moi

0

Voici filtre modèle de django qui a divisé une liste en plusieurs sous-listes:

list partition template filters at djangosnippets.org

Vous pouvez les utiliser dans un modèle de django pour diviser une longue liste en plusieurs colonnes comme suit:

{% load list_tags %} 
<h2>Some List</h2> 

{% for sub_list in full_list|rows:"3" %} 
<ul> 
    {% for item in sub_list %} 
    <li> 
     {{item.name}} 
    </li> 
    {% endfor %} 
</ul> 
{% endfor %} 

J'ai inclus les filtres de modèle dans mon projet dans un fichier appelé list_tags.py. Ajustez l'étiquette {% load %} si nécessaire.

Questions connexes