【发布时间】:2013-08-22 07:12:02
【问题描述】:
我创建的 JS sn-p 依赖于 {% for key, value in data.items %}..{% endfor %} 标记中可用的 forloop.counter 变量。
有没有办法将数学运算符(*、-、+、/)与forloop.counter 变量一起使用?
【问题讨论】:
标签: for-loop tags django-templates
我创建的 JS sn-p 依赖于 {% for key, value in data.items %}..{% endfor %} 标记中可用的 forloop.counter 变量。
有没有办法将数学运算符(*、-、+、/)与forloop.counter 变量一起使用?
【问题讨论】:
标签: for-loop tags django-templates
可以使用django内置的widthratio模板标签和add过滤器:
{{forloop.counter|add:5}}
{{forloop.counter|add:"-5"}} 中减去 5
{% widthratio forloop.counter 5 1 %}
{% widthratio forloop.counter 1 5 %}
【讨论】:
文档中有过滤器add。
我很确定没有内置方法可以在 Django 模板中对数字使用其他数学运算。但是,您始终可以make your own。这样做并不总是一个好主意。
您希望将逻辑保留在视图中,并将渲染保留在模板中。
在您的情况下,您应该将计数器存储在 JavaScript 变量中,并在您的 sn-p 中使用它。
【讨论】:
使用django-mathfilters。 addition 过滤器不会将数字强制转换为整数,因此您可以添加浮点数:
{% load mathfilters %}
{{ num1 | addition:num2 }}
【讨论】:
我在我的模板文件 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)
对我来说这种方法很好用
【讨论】:
在 Mathieu Marques 提示之后,这是我使用 custom filter 所做的。
使用分页 sn-p 后,模板每页呈现 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 的文件名。
【讨论】: