Jak ograniczyć listę obiektów do strony szablonu, a nie od strony widoku

83

Jednym ze sposobów ograniczania obiektów jest dodanie ograniczenia do takiej funkcji

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

Jak jednak osiągnąć to w szablonie, a nie w widoku?

Wiem, że możesz filtrować obiekty w szablonie i ograniczać liczbę znaków, ale jak faktycznie ograniczyć liczbę obiektów wyświetlanych w pętli. Za pomocą szablonu. na przykład poniższy kod będzie przechodził przez wszystkie obiekty ....

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

Jak przerwać pętlę, powiedzmy po pierwszych 3 obiektach / przedmiotach. I jak to zrobić w szablonie. Z góry dziękuję.

Stu
źródło
1
<a href=" docs.djangoproject.com/en/dev/ref/templates/builtins/#slice "> slice</a>
Ignacio Vazquez-Abrams,

Odpowiedzi:

180

Istnieje slicefiltr, którego możesz używać w szablonach. Działa to dokładnie tak samo, jak wycinanie w widoku.

{% for new in news|slice:":10" %}
Daniel Roseman
źródło
2
Jeśli masz scenariusz, w którym używasz {% for object in user.objects.all %} , możesz użyć{% for object in user.objects.all|slice:":10" %}
Samir Tendulkar
proszę daj mi link do dokumentacji plastra django.
squal
1
Jest dosłownie powiązany z moją odpowiedzią powyżej.
Daniel Roseman
Mam tego @Daniel. Przeszukuję plasterek w repozytorium github django, ale znajduję slice_filter, a nie plaster.
squal
Pracuje dla mnie.
bhattraideb
12

Chcesz użyć filtru szablonu wycinka

Oto Twój przykład zmieniony, aby go używać:

<ul>
{% for new in news|slice:":3" %}
<li>
<p>{{ new.title }}</p>
<p>{{ new.body }}</p>
</li>
{% endfor %}
</ul>
Chris Heisel
źródło
1
Wiem, że trochę się zrzędzę, ale powinno być: {{ new.title}}i {{ new.body }}
Hussam
to jest pełniejszy przykład kodu niż zaakceptowana odpowiedź, to jest bardziej pomocna odpowiedź, więc zagłosowałem za i wyjaśniam dlaczego
Keith