2009-06-14 4 views
25

Ceci est, espérons-le, rapide/facile. Je connais un moyen de contourner ce problème via une balise de gabarit personnalisée, mais j'étais curieux de savoir s'il y avait d'autres méthodes que je recherchais. J'ai créé une fonction de galerie pour mon blog, et j'ai une page de liste de galerie qui pagine toutes mes galeries. Maintenant, je ne veux pas montrer toutes les photos de chaque galerie dans cette liste, puisque si chaque galerie a même 20 images, alors c'est 100 images sur une page si je pagine à 5 postes. Ce serait un gaspillage et la mauvaise façon de faire les choses.django pour boucle de comptage

La question que j'ai est, est-il un moyen d'afficher simplement 3 photos à partir du jeu de photos? Ce que je voudrais faire, mais je ne pense est possible est quelque chose comme (pseudo-code):

{% for photos in gallery.photo_set %} 
    {% if forloop.counter lt 3 %} 
    <img src="{{ photos.url }}"> 
    {% endif %} 
{% endfor %} 

A en juger par la documentation, à moins que je suis tout à fait le manquer, ce n'est pas possible via le système de template. Par conséquent, je peux juste écrire mon propre modèle de balise de sorte à contourner ce problème. Je pourrais probablement faire quelque chose du point de vue, mais je n'ai pas regardé loin dans cette idée. L'autre option que j'ai est de donner au modèle un champ de prévisualisation, et permettre à l'utilisateur de sélectionner les photos qu'ils veulent dans le champ de prévisualisation.

De toute façon, quelques options différentes, alors j'ai pensé que je serais interroger le public pour voir comment vous le feriez. Toute opinion est appréciée. Personnellement, en appréciant qu'il existe de nombreuses façons de peau ce chat.

Répondre

69

Utilisation:

{% for photos in gallery.photo_set|slice:":3" %} 
+2

Donc, il y a toutes mes options, et puis il y a votre évidence flagrante que j'ai été négligent. Merci pour l'astuce, ça me sauve une tonne d'ennuis! – f4nt

+3

L'utilisation du filtre coupe présente un avantage supplémentaire. Si vous passez dans un QuerySet Django (par opposition à une collection), la tranche sera transmise à la requête SQL sous-jacente, limitant le nombre de lignes que la page va récupérer dans la base de données. –

+0

@Dave, +1: merci, je ne savais pas à propos de cette optimisation - cool! –

1

Ceci est mieux fait dans la collection gallery.photo_set. Le "3" codé en dur dans le modèle est une mauvaise idée à long terme.

class Gallery(object): 
    def photo_subset(self): 
     return Photo.objects.filter(gallery_id = self.id)[:3] 

Dans votre fonction de vue, vous pouvez faire des choses comme choisir 3 photos aléatoires, ou les 3 photos les plus récentes.

def photo_recent(self): 
     return Photo.objects.filter(gallery_id = self.id).orderby(someDate)[:3] 

    def photo_random(self): 
     pix = Photo.objects.filter(gallery_id = self.id).all() 
     random.shuffle(pix) 
     return pix[:3] 
+0

En fait, puisque le 3 a à voir avec la présentation, il s'intègre dans le modèle, d'autres modèles pourraient avoir plus d'espace et que vous voulez présenter 4 photos, non? – noio

+0

@Noio: Regrouper les photos dans des listes de listes doit être dans la fonction de vue. Le modèle prend juste les listes de listes et les affiche. –

+1

Il est étrange que vous lui disiez de ne pas "coder" une constante dans le modèle, mais de fournir un exemple de cette même constante dans le code du serveur. C'est un conseil terrible - le modèle est exactement où vous voudriez mettre une variable qui peut changer basée sur des changements de conception. –