Он умеет писать {{ myval.add:5 }}
, {{ myval|add:value }}
и даже {{ myval|add:-5 }}
.
Однако я не могу узнать, что я должен ввести, чтобы добавить значение * -1, например {{ myval|add:-value }}
. Это печально не работает.
Он умеет писать {{ myval.add:5 }}
, {{ myval|add:value }}
и даже {{ myval|add:-5 }}
.
Однако я не могу узнать, что я должен ввести, чтобы добавить значение * -1, например {{ myval|add:-value }}
. Это печально не работает.
Встроенные теги/фильтры шаблонов Django не являются всеохватывающими, но очень легко написать собственные теги шаблонов: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/
Вы можете легко создать собственный тег шаблона subtract
:
@register.filter
def subtract(value, arg):
return value - arg
Вам нужно использовать двойные кавычки:
{{ myval|add:"-5" }}
Это вычитает пять из myval
.
https://pypi.python.org/pypi/django-mathfilters
установить: $pip установить 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 и скрыть остальные, показывая, сколько скрытых предметов есть, например.
John, Anna и еще 5 таких (при предоставлении списка из 7 предметов)
Пока количество видимых элементов закодировано в шаблоне (например, 2), можно добавить отрицательный 2 |add:"-2"
, но я хотел, чтобы количество видимых элементов также было переменной. Библиотека Math-фильтра, как было предложено выше, не кажется актуальной (я не тестировал ее с Django 2.x).
Трюк, похоже, заключается в использовании помощника add
для объединения строк "-" с целым числом в виде строки, поэтому его можно принудительно вернуть обратно к отрицательному целому числу в любом последовательном add
помощника add
. Однако это не работает, если значение не является строкой, поэтому там, где stringformat
помощник 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, я уверен, что этот подход намного хуже, чем фактически создание специального помощника! Поэтому я не предлагаю, чтобы кто-то использовал это. Это была моя попытка попытаться решить эту проблему с помощью доступных помощников шаблонов и без каких-либо настраиваемых материалов.
Надеюсь это поможет