向Django模板中的变量添加值

向Django模板中的变量添加值,django,Django,这是一个非常快速的问题,我认为这可能是模板中的一个限制 我使用| add:“num”功能向模板中的变量添加一个值,我尝试使用另一个变量作为数字,但它似乎不起作用。这可能吗 e、 g 谢谢大家 韦恩你需要像这样的东西: {{ pagecontrol.start_page|sub:pagecontrol.new_per_page }} {{ pagecontrol.start_page|subtract:pagecontrol.news_per_page }} Django不提供用于执行减法的内

这是一个非常快速的问题,我认为这可能是模板中的一个限制

我使用| add:“num”功能向模板中的变量添加一个值,我尝试使用另一个变量作为数字,但它似乎不起作用。这可能吗

e、 g

谢谢大家


韦恩

你需要像这样的东西:

{{ pagecontrol.start_page|sub:pagecontrol.new_per_page }}
{{ pagecontrol.start_page|subtract:pagecontrol.news_per_page }}

Django不提供用于执行减法的内置模板标记/过滤器。此外,没有用于将正整数转换为负整数的内置过滤器。您必须为此编写模板标记。

解决方案1-使用自定义模板过滤器:

@register.filter
def subtract(value, arg):
    return value - arg
然后在模板中,您可以执行以下操作:

{{ pagecontrol.start_page|sub:pagecontrol.new_per_page }}
{{ pagecontrol.start_page|subtract:pagecontrol.news_per_page }}
解决方案2-使用库

可以使用Django mathfilters库获取减法过滤器

首先,在模板顶部加载
mathfilters
。然后在模板中使用
sub
过滤器,如下所示:

{% load mathfilters %}

{{ pagecontrol.start_page|sub:pagecontrol.news_per_page }}
为什么您的代码不起作用?

add
内置过滤器的Django源代码:

@register.filter(is_safe=False)
def add(value, arg):
    """Adds the arg to the value."""
    try:
        return int(value) + int(arg)
    except (ValueError, TypeError):
        try:
            return value + arg
        except Exception:
            return ''
当您在模板中执行
{{pagecontrol.start|page{add:“-pagecontrol.news_per_page”}
时,
'-pagecontrol.news_per_page'
字符串作为
arg
传递给上面的
add
内置过滤器,而不是它的实际值,因此由于添加整数和字符串值而引发异常<代码>'作为最终值由
add
过滤器返回,因此不显示任何内容

注意:

对于复杂变量名称,您可以将
模板标记一起使用。它将以更简单的名称缓存复杂变量

下面是将
一起使用
添加
过滤器的示例。这将只添加值

{% with my_variable=pagecontrol.news_per_page %}
这将在变量
my\u variable
中存储
pagecontrol.news\u per\u page
的值。然后在模板中,可以使用以下变量:

{{ pagecontrol.start_page|add:my_variable }}
这将添加两个变量

{% with my_variable=pagecontrol.news_per_page %}

    {{ pagecontrol.start_page|add:my_variable }}

{% endwith %}

你基本上不能。除了Rahul Gupta所说的之外,Django还有一个明确的设计理念来防止模板中的高级逻辑(尽管减法根本不是高级逻辑):

模板系统故意不允许以下情况:

- Assignment to variables
- Advanced logic
目标不是发明一种编程语言。目标是提供 只需要足够的编程功能,比如分支和 循环,这对于做出与演示文稿相关的决策至关重要


您可以根据Rahul发布的Django core
add
filter创建自己的用于减法的筛选器,或者在视图中执行任何减法操作。

创建模板标记并使用该标记处理此类情况。抱歉@Rahul Gupta,这不起作用。{%with newsperpage=-pagecontrol.news\u per\u page%}
  • {%endwith%}{%endif%}{%if pagecontrol.next\u page
  • {%endwith%}阅读了@lorenzo Pena的回复后,我也传递了该参数的负版本。感谢您花时间发布回复。Django不提供内置模板标记/过滤器来进行减法运算。我们必须自己实施。使用2种可能的解决方案更新了ans。