4 ответов:
встроенные теги/фильтры шаблонов Django не являются всеобъемлющими, но очень легко написать свои собственные теги шаблонов:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/
вы могли бы сделать свой собственный
subtractшаблон тег довольно легко:@register.filter def subtract(value, arg): return value - arg
https://pypi.python.org/pypi/django-mathfilters
install: $ pip install django-mathfilters в шаблоне
{% load mathfilters %} <ul> <li>8 + 3 = {{ 8|add:3 }}</li> <li>13 - 17 = {{ 13|sub:17 }}</li> {% with answer=42 %} <li>42 * 0.5 = {{ answer|mul:0.5 }}</li> {% endwith %} {% with numerator=12 denominator=3 %} <li>12 / 3 = {{ numerator|div:denominator }}</li> {% endwith %} <li>|-13| = {{ -13|abs }}</li> </ul>
недавно я начал работать с Django и наткнулся на это: мне нужен был очень простой цикл шаблонов, который прекращает печать после n раз и показывает ссылку "больше" для переключения остальных элементов.
С большим интересом я читаю борьбу людей, пытающихся понять, почему это не добавляется к фильтрам по умолчанию Django (так как до 2013 года). Мне не хотелось создавать пользовательский тег шаблона, и я вроде как нашел способ вычесть 2 переменные с помощью строк и
addв сочетании сwithиstringformatдопустим, у меня есть список элементов, где я хочу напечатать первые 2 и скрыть остальные, показывая, сколько скрытых элементов есть, например.
Джон, Анна и 5 других, как это (когда дается список из 7 пунктов)
пока количество видимых элементов закодировано в шаблоне (например. 2), можно добавить отрицательный 2
|add:"-2", но я хотел, чтобы количество видимых элементов, чтобы быть переменной. Библиотека Math-filter, как было предложено выше, не кажется актуальной (я не тестировал ее с Django 2.икс.)трюк, кажется, чтобы использовать
addпомощник для объединения строк " - " с целым числом как строкой, поэтому его можно принудительно вернуть к отрицательному целому числу в любом последовательном вызовеaddпомощником. Это не работает, однако, если значение не является строкой, так что вот гдеstringformatпомощник приходит.со строковым значением
шаблон
posts.html(обратите внимание, какvisibleявно передается как строка-альтернатива ниже){% for post in posts %} <h4>{{ post.title }}</h4> ... {% include 'show_likes.html' with likes=post.likes visible="3" %} {% endfor %}шаблон
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", чтобы он был преобразован в string
шаблон
posts.html{% for post in posts %} <h4>{{ post.title }}</h4> ... {% include 'show_likes.html' with likes=post.likes visible=3 %} {% endfor %}шаблон
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, я уверен, что этот подход намного хуже, чем на самом деле создание пользовательского помощника! Поэтому я не предлагаю, чтобы кто-то использовал это. Это была просто моя попытка решить эту проблему с помощью доступных помощников шаблонов и без каких-либо пользовательских вещей.
надеюсь, что это помогает
Comments