2009-06-14 18 views
25

Questo è sperabilmente un rapido/facile. Conosco un modo per aggirare questo problema tramite un tag modello personalizzato, ma ero curioso di sapere se c'erano altri metodi che stavo cercando. Ho creato una sorta di funzione di galleria per il mio blog e ho una pagina di elenco di gallerie che impagina tutte le mie gallerie. Ora, non voglio mostrare tutte le foto di ogni galleria in quella lista, dal momento che se ciascuna galleria ha anche 20 immagini, allora sono 100 le immagini su una pagina se paginate in 5 post. Sarebbe uno spreco e il modo sbagliato di fare le cose.django per il ciclo di controinterruzione

La domanda che ho è, c'è un modo per visualizzare solo 3 foto dal set di foto? Quello che mi piacerebbe fare, ma non lo faccio pensare è possibile è qualcosa di simile (pseudocodice):

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

A giudicare dalla documentazione, a meno che non mi manca completamente di esso, che non è possibile tramite il sistema di template. Quindi, posso semplicemente scrivere il mio modello di tag di ordinamento per aggirare il problema. Probabilmente potrei fare qualcosa dall'aspetto della vista, ma non ho guardato a lungo in quell'idea. L'altra opzione che ho è dare al modello un campo di anteprima e consentire all'utente di selezionare le foto che vogliono nel campo di anteprima.

In ogni caso, alcune opzioni diverse, quindi ho pensato di interrogare il pubblico per vedere come lo avresti fatto. Qualsiasi opinione è apprezzata. Personalmente, godendo che ci sono numerosi modi per pelle questo gatto.

risposta

69

Usa:

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

Quindi, ci sono tutte le mie opzioni, e poi c'è il tuo palesemente ovvio che ho trascurato. Grazie per il suggerimento, mi fa risparmiare un sacco di problemi! – f4nt

+3

L'utilizzo del filtro delle sezioni offre un ulteriore vantaggio. Se passi in un Djery QuerySet (al contrario di una raccolta), la sezione passerà alla query SQL sottostante, limitando il numero di righe che la pagina attiverà dal database. –

+0

@Dave, +1: grazie, non sapevo di questa ottimizzazione - cool! –

1

Questo è meglio fatto nella collezione gallery.photo_set. Il "3" hard-coded nel modello è una cattiva idea a lungo termine.

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

Nella funzione di visualizzazione, è possibile fare cose come prendere 3 foto casuali, o le 3 foto più recenti.

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

In realtà, poiché il 3 ha a che fare con la presentazione che si adatta al modello, altri modelli potrebbero avere più spazio e presentare 4 foto, no? – noio

+0

@Noio: raggruppare le foto in elenchi di elenchi dovrebbe essere nella funzione di visualizzazione. Il modello prende solo gli elenchi degli elenchi e li visualizza. –

+1

lott è strano che tu gli stia dicendo di non "codice rigido" una costante nel modello, ma poi di fornire un esempio di quella stessa costante nel codice del server. Questo è un consiglio terribile: il modello è esattamente dove vorresti inserire una variabile che può essere cambiata in base alle modifiche del progetto. –

Problemi correlati