Как добавить, умножить числовые переменные в шаблоне Django?

Фрагмент кода JS, который я создал, основан на переменной forloop.counter, доступной в теге {% for key, value in data.items %}..{% endfor %}.

Есть ли способ использовать математические операторы (*, -, +, /) вместе с переменной forloop.counter?


person Charlesliam    schedule 20.08.2013    source источник


Ответы (5)


В документации есть фильтр add.

Я почти уверен, что в шаблонах Django нет встроенного способа использовать другие математические операции над числами. Вы всегда можете создать свой собственный< /а> однако. Это не всегда хорошая идея.

Вы хотите сохранить свою логику внутри представлений и сохранить рендеринг внутри шаблонов.

В вашем случае вы должны сохранить свой счетчик в переменной JavaScript и использовать его в своем фрагменте кода.

person Mathieu Marques    schedule 20.08.2013
comment
Ссылка больше не работает. Здесь последняя версия. - person J0ANMM; 31.03.2017
comment
Одно из приложений рендеринга для добавления фильтра состоит в том, чтобы добавить 1 к числу, начинающемуся с нуля (в моем примере это номер строки в электронной таблице Excel) для человеческого восприятия. Я думаю, это можно было бы оспорить в любом случае, но мне удобно делать это в шаблоне, а не в моем коде синтаксического анализа файла Excel или добавлять в представление. - person Deepstop; 30.06.2021

Можно использовать встроенный в django тег шаблона widthratio и добавить фильтр:

  • добавить 5 к forloop.counter {{forloop.counter|add:5}}
  • вычесть 5 из forloop.counter {{forloop.counter|add:"-5"}}
  • разделить forloop.counter на 5 {% widthratio forloop.counter 5 1 %}
  • умножить forloop.counter на 5 {% widthratio forloop.counter 1 5 %}
person Sergey Lyapustin    schedule 10.07.2015
comment
Судя по всему, он округляет числа с плавающей запятой, да? - person keramat; 21.12.2019

Используйте django-mathfilters. Фильтр addition не приводит числа к целому числу, поэтому вы можете добавлять числа с плавающей запятой:

{% load mathfilters %}
{{ num1 | addition:num2 }}
person MadeOfAir    schedule 12.02.2017
comment
это стороннее решение мне нравится больше всего. Больше гибкости при использовании с JavaScript, я часто использую числа с плавающей запятой. - person Constantine Kurbatov; 05.07.2021

Я делаю следующее в моем файле шаблона carts.html

{% extends 'base.html'%} {% block contenido %}
<h1>Checkout</h1>
<p>Subtotal + IVA: ${{ orden.sub_total }}</p>
<p>Envio:$ {{ orden.costo_envio }}</p>
<p>Total a pagar:$ {{ orden.sub_total|add:orden.costo_envio }}</p>
{% endblock %}

где моя функция, основанная на представлении:

def carrito_checkout(request):
    if 'cart_id' in request.session:
        orden_object, created = Orden.objects.get_or_new(request)
        if orden_object is None:
            return redirect('carrito:home')
        print(orden_object)
        context = {
            "orden": orden_object
        }

    return render(request, 'carrito_checkout.html', context=context)

Для меня этот подход отлично работает

введите здесь описание изображения

person Egalicia    schedule 08.04.2018

Следуя советам Матье Маркеса, вот что я сделал, используя пользовательский фильтр .

Шаблон отображает 5 записей на странице после использования фрагмента страницы. Постраничное представление сбрасывает forloop.counter. Чтобы создать непрерывный счетчик на странице..

from django import template
register = template.Library()

@register.filter(name='cei')
def compute_exact_id(value, rb_page_no):    
    new_id = value+(5*(rb_page_no-1))    ## here's the mathematical operation
    return new_id

где rb_page_no — номер текущей страницы, а {% load extra_filter %} — поверх моего шаблона, где extra_filter — имя файла, в который я помещаю compute_exact_id.

person Charlesliam    schedule 20.08.2013