django模板中的变量减法

aem*_*mdy 56 django django-templates

它能够写{{ myval.add:5 }},{{ myval|add:value }}甚至{{ myval|add:-5 }}.

但是,我无法找到我应该键入的值来添加*-1之类的{{ myval|add:-value }}.遗憾的是,这不起作用.

Sim*_*ser 100

你需要使用双引号:

{{ myval|add:"-5" }}
Run Code Online (Sandbox Code Playgroud)

这减去了五个myval.

  • 我需要从变量中减去值. (17认同)
  • 这不是一个好的答案.我需要从变量中减去一个变量.如果我有`x == 5`和`y == 2`,我如何在模板中表达`x-y`? (7认同)
  • 是否可以在视图中而不是在模板中使值为负? (4认同)
  • 谢谢,我一直试图建立一个减法过滤器,这更容易哈哈 (4认同)

Chr*_*tte 60

内置的Django模板标签/过滤器并不是无所不包,但编写自己的自定义模板标签非常容易:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

您可以subtract非常轻松地制作自己的模板标签:

@register.filter
def subtract(value, arg):
    return value - arg
Run Code Online (Sandbox Code Playgroud)

  • 这样的任务不需要模板标签.见西蒙的回答. (4认同)
  • Simeon的答案无法回答问题,因为它涉及减去变量中定义的数量。 (4认同)

小智 12

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>
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这些应该包含在主Django发行版中. (7认同)

4le*_*els 5

我最近开始使用 Django 并偶然发现了这个:我需要一个非常简单的模板循环,它在 n 次后停止打印并显示一个“更多”链接来切换其余项目。

我怀着极大的兴趣阅读了人们试图理解为什么没有将其添加到 Django 默认过滤器(自 2013 年之前)的努力。我不想创建自定义模板标签,我找到了一种使用字符串减去 2 个变量的方法,并add结合使用withstringformat

假设我有一个项目列表,我想在其中打印前 2 个并隐藏其余项目,显示有多少隐藏项目,例如。

John、Anna 和其他 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 %}
Run Code Online (Sandbox Code Playgroud)

模板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 %}
Run Code Online (Sandbox Code Playgroud)

整数的替代

您可以使用以下方法将整数转换为调用模板中的字符串 |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 %}
Run Code Online (Sandbox Code Playgroud)

模板 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 %}
Run Code Online (Sandbox Code Playgroud)

由于我是 Django 和 Python 的初学者,我很确定这种方法比实际创建自定义帮助程序要糟糕得多!所以我不是建议任何人都应该使用它。这只是我尝试使用可用的模板助手解决此问题而没有任何自定义内容的尝试。

希望这可以帮助