Вычитание переменной в шаблонах Django - PullRequest
53 голосов
/ 30 марта 2012

Он умеет писать {{ myval.add:5 }}, {{ myval|add:value }} и даже {{ myval|add:-5 }}.

Однако я не могу выяснить, что мне следует набрать, чтобы добавить значение * -1, например {{ myval|add:-value }}. К сожалению, это не работает.

Ответы [ 4 ]

93 голосов
/ 30 марта 2012

Вам необходимо использовать двойные кавычки:

{{ myval|add:"-5" }}

Это вычитает пять из myval.

58 голосов
/ 30 марта 2012

Встроенные теги / фильтры шаблонов Django не являются всеобъемлющими, но написать собственные пользовательские теги шаблонов очень просто:

Вы можете довольно легко создать свой собственный subtract шаблон тега:

@register.filter
def subtract(value, arg):
    return value - arg
12 голосов
/ 02 октября 2016

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>
3 голосов
/ 22 июля 2018

Я недавно начал работать с 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, я уверен, что этот подход намного хуже, чем создание собственного помощника!Так что я не предлагаю никому использовать это.Это была просто моя попытка решить эту проблему с помощью доступных помощников шаблонов и без каких-либо пользовательских вещей.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...