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ę.


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" %}

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>

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.