Вычитание переменных в шаблонах django

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

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


person aemdy    schedule 30.03.2012    source источник


Ответы (5)


Встроенные теги/фильтры шаблона Django не являются всеобъемлющими, но очень легко написать свои собственные теги шаблона: https://docs.djangoproject.com/en/dev/howto/custom.-template-tags/

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

@register.filter
def subtract(value, arg):
    return value - arg
person Chris Forrette    schedule 30.03.2012
comment
нет необходимости в теге шаблона для такой задачи. Смотрите ответ Симеона. - person rom; 26.03.2014
comment
Ответ Симеона не отвечает на вопрос, поскольку он касается вычитания на сумму, определенную в переменной. - person Teekin; 20.06.2017

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

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

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

person Simeon Visser    schedule 30.03.2012
comment
Мне нужно вычесть значение из переменной. - person aemdy; 30.03.2012
comment
Можно ли сделать значение отрицательным в представлении, а не в шаблоне? - person Simeon Visser; 30.03.2012
comment
Спасибо, я все это время пытался построить фильтр вычитания, и это даже проще, ха-ха - person JREAM; 17.05.2013
comment
Это плохой ответ. Мне нужно вычесть переменную из переменной. Если у меня есть x == 5 и y == 2, как выразить x - y в шаблоне? - person Gershy; 03.11.2015
comment
@GershomMaes создайте тег шаблона, чтобы получить в качестве аргумента число, которое вы хотите вычесть. myval|subtract:anotherval - person Ev.; 25.02.2016
comment
Хорошо спасибо! Я просто пытался выяснить, был ли единственный способ сделать это с помощью пользовательского тега шаблона. - person Gershy; 25.02.2016
comment
это в значительной степени худший способ, который я видел, чтобы сделать что-то такое простое, как вычитание. Не ваша вина, а язык шаблонов django? что случилось - person Toskan; 26.07.2019

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>
person Mahesh    schedule 02.10.2016
comment
На мой взгляд, они должны быть включены в основной дистрибутив Django. - person Teekin; 20.06.2017
comment
вам нужно добавить mathfilters к вашему INSTALLED_APPS. - person suhailvs; 14.10.2020

Недавно я начал работать с Django и тоже наткнулся на это: мне нужен был очень простой цикл шаблона, который останавливает печать после n раз и показывает ссылку «еще» для переключения остальных элементов.

С большим интересом читаю борьбу людей, пытающихся понять, почему это не добавляется в фильтры Django по умолчанию (с до 2013 года). Мне не хотелось создавать собственный тег шаблона, и я нашел способ вычесть 2 переменные, используя строки и add в сочетании с with и stringformat

Допустим, у меня есть список элементов, в которых я хочу напечатать первые 2 и скрыть остальные, показав, сколько там скрытых элементов, например.

Джону, Анне и еще 5 нравится это (при наличии списка из 7 пунктов)

Пока количество видимых элементов закодировано в шаблоне (например, 2), можно добавить отрицательное значение 2 |add:"-2", но я хотел, чтобы количество видимых элементов также было переменной. Библиотека Math-filter, предложенная выше, кажется устаревшей (я не тестировал ее с Django 2.x).

Хитрость, похоже, заключается в использовании помощника 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", чтобы преобразовать его в строку.

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

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

person 4levels    schedule 22.07.2018

Lo primero es multiplicar por -1 para convertirlo en una valor negativo y guardarlo en una variable y posterior a usar la suma

Во-первых, нужно умножить на -1, чтобы превратить его в отрицательное значение и сохранить его в переменной, а затем использовать команду add.

{% widthratio val2 1 -1 as result %}
{{result|add:val1}}
person Andres Mejia    schedule 24.12.2020