django 模板中的变量减法

问题描述 投票:0回答:7

它可以写

{{ myval.add:5 }}
{{ myval|add:value }}
甚至
{{ myval|add:-5 }}

但是,我找不到应该输入什么来添加值* -1,例如

{{ myval|add:-value }}
。遗憾的是,这不起作用。

django django-templates
7个回答
153
投票

您需要使用双引号:

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

这会从

myval
中减去 5。


83
投票

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

您可以轻松制作自己的

subtract
模板标签:

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

29
投票

使用 PyPI 中的

django-mathfilters
https://pypi.python.org/pypi/django-mathfilters

安装:

$ pip install django-mathfilters

然后将

mathfilters
添加到您的
INSTALLED_APPS
中。

在模板中:

{% 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>

5
投票

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

我怀着极大的兴趣阅读了人们试图理解为什么它没有被添加到 Django 默认过滤器中的挣扎(从 2013 年开始)。 我不想创建自定义模板标签,我找到了一种使用字符串和

add
结合
with
stringformat

减去 2 个变量的方法

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

John、Anna 和其他 5 个人喜欢这样(当给出 7 个项目的列表时)

只要可见项目的数量在模板中进行了编码(例如 2),就可以添加负 2

|add:"-2"
,但我希望可见项目的数量也成为一个变量。 上面建议的数学过滤器库似乎不是最新的(我还没有使用 Django 2.x 对其进行测试)。

技巧似乎是使用

add
帮助器将字符串“-”与整数作为字符串连接起来,因此在对
add
帮助器的任何连续调用中都可以将其强制返回负整数。 但是,如果该值不是字符串,则这不起作用,因此这就是
stringformat
帮助器的用武之地。

带有字符串值

template

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 的初学者,我很确定这种方法比实际创建自定义助手差得多! 所以我并不是建议任何人都应该使用这个。 这只是我尝试使用可用的模板助手来解决这个问题,而不需要任何自定义的东西。

希望这有帮助


2
投票

Lo primero es multiplicar por -1 para conversionirlo en una valor negativo y Guardarlo en una Variable y after a usar la suma

首先乘以-1,变成负值 并将其保存在变量中,然后使用 add

{% widthratio val2 1 -1 as result %}
{{result|add:val1}}

0
投票

如果您正在访问的变量属于 ORM 对象,如下所示:

{{ obj.my_val|add:-obj.other_val }}

您可以简单地在 django 模型上实现一个属性。

Class Obj(models.Model):
  my_val = PositiveIntegerField()
  other_val = PositiveIntegerField()

  @property
  val_diff(self):
    return self.my_val - self.other_val

然后像属性一样使用它:

{{ obj.val_diff }}

-2
投票

经过搜索我发现我可以用

filters
来制作{% with var=value %}来进行算术运算“是否有其他变量”
例如:我有
x = 5
y = 3
,需要将
y
的值添加到
x
值,我需要的就是以下步骤:
1-创建变量x:
{% with x=5 %}

2-创建变量 y :
{% with y=3 %}

3- 在我的 HTML 标签中,
<h1>
,写下:
<h1>{{ x|add:y }}</h1>

4- 用 :
{% endwith %}

关闭 y 5- 用 :
{% endwith %}

关闭 x 希望它对你有用,对我也有用。

{% with i=3 %}
    {% with x=1 %}
         <h1>{{i|add:x}}</h1> <!-- result is 4 -->
    {% endwith %}
{% endwith %}
© www.soinside.com 2019 - 2024. All rights reserved.