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

JS фрагментът, който създадох, разчита на това, че променливата forloop.counter е налична в рамките на {% for key, value in data.items %}..{% endfor %} таг.

Има ли начин да се използват математически оператори (*, -, +, /) заедно с променливата forloop.counter?


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


Отговори (5)


Има филтър добавяне от документацията.

Почти съм сигурен, че няма вграден начин за използване на другите математически операции над числа в шаблоните на 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

След съветите на Mathieu Marques, ето какво направих с помощта на персонализиран филтър .

Шаблонът изобразява 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