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



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



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

792   4  

4 ответов:

встроенные теги/фильтры шаблонов 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

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

    Ничего не найдено.