Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

@register.filter
def subtract(value, arg):
    return value - arg

Ответ 2

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

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

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

Ответ 3

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>

Ответ 4

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

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