¿Cómo se limita el lado de la plantilla de la lista de objetos, en lugar del lado de la vista?

83

Una de las formas de limitar los objetos es agregar una limitación a una función como esta

def ten_objects():
    obj = Model.objects.all()[0:10]  # limit to 10
    return {'objects': obj}

Sin embargo, ¿cómo se logra esto dentro de una plantilla en lugar de dentro de una vista?

Sé que puede filtrar objetos dentro de una plantilla y limitar caracteres, pero ¿cómo se limita realmente la cantidad de objetos que se muestran en un bucle? A través de la plantilla. por ejemplo, el siguiente código recorrerá todos los objetos ...

    <ul>
     {% for new in news %}
      <li>
       <p>{{ news.title }}</p>
       <p>{{ news.body }}</p>
      </li>
     {% endfor %}
    </ul>

¿Cómo rompo el bucle, digamos después de los primeros 3 objetos / elementos? ¿Y cómo lo hago dentro de la plantilla? Gracias por adelantado.

Stu
fuente
1
<a href=" docs.djangoproject.com/en/dev/ref/templates/builtins/#slice "> slice</a>
Ignacio Vazquez-Abrams

Respuestas:

178

Hay un slicefiltro que puede utilizar en las plantillas. Esto funciona exactamente igual que cortar dentro de la vista.

{% for new in news|slice:":10" %}
Daniel Roseman
fuente
2
Si tiene un escenario en el que está usando {% for object in user.objects.all %} , puede usar{% for object in user.objects.all|slice:":10" %}
Samir Tendulkar
por favor, dame el enlace de documentación de cortes de django.
squal
1
Está literalmente vinculado a mi respuesta anterior.
Daniel Roseman
Lo tengo @Daniel. Busco slice en el repositorio de github django pero encuentro slice_filter no slice.
squal
12

Desea utilizar la rebanada filtro de plantilla

Aquí está su ejemplo modificado para usarlo:

<ul>
{% for new in news|slice:":3" %}
<li>
<p>{{ new.title }}</p>
<p>{{ new.body }}</p>
</li>
{% endfor %}
</ul>
Chris Heisel
fuente
1
Sé que estoy un poco molesto, pero debería ser: {{ new.title}}y {{ new.body }}
Hussam
este es un ejemplo de código más completo que la respuesta aceptada, esta es una respuesta más útil, así que voté y explico por qué
Keith