Я недавно начал работать с Django и наткнулся на это тоже: мне нужен был очень простой шаблонный цикл, который останавливает печать через n раз и показывает ссылку «more» для переключения остальных элементов.
С большим интересом я читаю борьбу людей, пытающихся понять, почему это не добавляется в фильтры по умолчанию в Django (до 2013 года).Мне не хотелось создавать пользовательский тег шаблона, и я нашел способ вычесть 2 переменные, используя строки и add
в сочетании с with
и stringformat
Допустим, у меня есть списокиз предметов, где я хочу напечатать первые 2 и скрыть остальные, показывая, сколько там скрытых предметов, например.
Джон, Анна и еще 5 таких как (когда дан список из 7 предметов)
Пока количество видимых элементов в шаблоне запрограммировано (например, 2), можно добавить отрицательный 2 |add:"-2"
, но я хотел, чтобы количество видимых элементов также было переменной.Библиотека Math-фильтра, как предложено выше, не выглядит актуальной (я не тестировал ее с Django 2.x).
Похоже, хитрость заключается в использовании хелпера add
для объединения строк "-" с целым числом как строкой, поэтому его можно принудительно вернуть к отрицательному целому числу при любых последовательных вызовах * 1016.* помощник.Однако это не сработает, если значение не является строкой, так что тут появляется помощник stringformat
.
со значением строки
template posts.html
(обратите внимание, как visible
явно передается как строка - альтернатива ниже)
{% for post in posts %}
<h4>{{ post.title }}</h4>
...
{% include 'show_likes.html' with likes=post.likes visible="3" %}
{% endfor %}
template show_likes.html
(обратите внимание на add:0
, чтобы заставить работать логический оператор)
{% with show=visible|default:"2" %}
{% for like in likes %}
{% if forloop.counter <= show|add:0 %}
{% if not forloop.first %},{% endif %}
{{ like.username }}
{% endif %}
{% endfor %}
{% if likes|length > show|add:0 %}
{% with rest="-"|add:show %}
and {{ likes|length|add:rest }} more
{% endwith %}
{% endif %}
like this
{% endwith %}
Альтернатива с целым числом
Вы можете просто преобразовать ваше целое число в строку в вызывающем шаблоне, используя |stringformat:"d"
Если, однако, количество видимых элементов, которые вы хотите показать, является целым числом, вынужно добавить вызов в stringformat: "d", чтобы преобразовать его в строку
template posts.html
{% for post in posts %}
<h4>{{ post.title }}</h4>
...
{% include 'show_likes.html' with likes=post.likes visible=3 %}
{% endfor %}
template show_likes.html
{% with show=visible|default:2 %}
{% with show_str=show|stringformat:"d" %}
{% for like in likes %}
{% if forloop.counter <= show %}
{% if not forloop.first %},{% endif %}
{{ like.username }}
{% endif %}
{% endfor %}
{% if likes|length > show|add:0 %}
{% with rest="-"|add:show_str %}
and {{ likes|length|add:rest }} more
{% endwith %}
{% endif %}
{% endwith %}
{% endwith %}
СЯ очень новичок в Django и Python, я уверен, что этот подход намного хуже, чем создание собственного помощника!Так что я не предлагаю никому использовать это.Это была просто моя попытка решить эту проблему с помощью доступных помощников шаблонов и без каких-либо пользовательских вещей.
Надеюсь, это поможет