2009-06-14 22 views
25

Espero que sea rápido/fácil. Conozco una forma de evitar esto mediante una etiqueta de plantilla personalizada, pero tenía curiosidad por saber si había otros métodos que estaba buscando. Creé una especie de función de galería para mi blog, y tengo una página de lista de galería que pagina todas mis galerías. Ahora, no quiero mostrar todas las fotos de cada galería en esa lista, ya que si cada galería tiene incluso 20 imágenes, entonces son 100 imágenes en una página si pagino en 5 publicaciones. Eso sería un desperdicio, y la forma incorrecta de hacer las cosas.django for loop counter break

La pregunta que tengo es, ¿hay alguna manera de simplemente mostrar 3 fotos del conjunto de fotos? Lo que me gustaría hacer, pero no lo hago piensan que es posible es algo así como (pseudocódigo):

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

A juzgar por la documentación, a menos que esté completamente no haberlo hecho, eso no es posible a través de la sistema de plantillas Por lo tanto, puedo simplemente escribir mi propia etiqueta de plantilla para solucionarlo. Probablemente podría hacer algo desde el punto de vista, pero no he profundizado en esa idea. La otra opción que tengo es darle al modelo un campo de vista previa y permitirle al usuario seleccionar las fotos que quiere en el campo de vista previa.

De todos modos, algunas opciones diferentes, así que pensé en sondear al público para ver cómo lo harías. Cualquier opinión es apreciada. Personalmente, disfrutando de que hay numerosas maneras de despellejar a este gato.

Respuesta

69

Uso:

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

Entonces, hay todas mis opciones, y luego está su descaradamente obvio que he estado pasando por alto. Gracias por la propina, ¡me ahorra un montón de problemas! – f4nt

+3

El uso del filtro de corte tiene un beneficio adicional. Si transfiere un Django QuerySet (en lugar de una colección), el sector pasará a la consulta SQL subyacente, lo que limita el número de filas que la página recuperará de la base de datos. –

+0

@Dave, +1: gracias, no sabía sobre esa optimización, ¡genial! –

1

Esto es mejor hecho en la colección gallery.photo_set. El "3" codificado en la plantilla es una mala idea a largo plazo.

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

En su función de vista, puede hacer cosas como elegir 3 fotos al azar, o las 3 fotos más recientes.

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 realidad, dado que el 3 tiene que ver con la presentación que cabe en la plantilla, otras plantillas pueden tener más espacio y desea presentar 4 fotos, ¿no? – noio

+0

@Noio: Agrupar las fotos en listas de listas debe estar en la función de vista. La plantilla simplemente toma las listas de listas y las muestra. –

+1

lott es extraño que le diga que no "codifique" una constante en la plantilla, sino que proporcione un ejemplo de esa misma constante en el código del servidor. Este es un consejo terrible: la plantilla es exactamente donde le gustaría poner una variable que puede cambiar en función de los cambios de diseño. –