Django模板报错:无法解析forloop.counter|add:page_obj.start_index()中的'()'
问题
尝试使用分页器get_page()对象的start_index值,让for循环根据之前页面的元素数量显示元素ID。但在模板中将该值与forloop.counter相加时,出现错误:
Could not parse the remainder: '()' from 'forloop.counter|add:page_obj.start_index()'
视图代码如下:
def openAllOrders(request): orders = cache_getFilteredOrders(request) orders_per_page = 10 paginator = Paginator(orders, orders_per_page) page_number = int(request.GET.get('page', 1)) page_obj = paginator.get_page(page_number) orders_before = (page_number-1) * orders_per_page page_orders = page_obj.object_list tbody_html = getOrdersTable(request, page_orders, orders_before) context = dict(tbody=tbody_html, page_obj=page_obj, type=request.GET.get('type'), date_start=request.GET.get('date_start'), date_end=request.GET.get('date_end'), orders_amount=len(orders),) return render(request, "order.html", context)
调试器中page_obj.start_index()的值显示正常,请问哪里操作有误?如何正确将该值与forloop.counter相加?
解决方法
错误原因
Django模板语法中,访问对象的无参数方法时不需要加括号。模板会自动调用这类方法,你在模板里写page_obj.start_index()属于非法语法,这就是报错的直接原因。
正确写法
- 先修正模板中的调用方式,把
page_obj.start_index()改为page_obj.start_index。 - 注意逻辑修正:
start_index返回的是当前页第一个元素的全局位置(从1开始计数),而forloop.counter是当前页内的元素序号(同样从1开始)。直接相加会导致重复计数,比如第一页第一个元素会变成1+1=2,不符合需求。正确的全局ID计算有两种写法:- 利用
forloop.counter0(从0开始的页内序号)直接相加:{{ page_obj.start_index|add:forloop.counter0 }} - 用
forloop.counter做减法修正:{{ page_obj.start_index|add:forloop.counter|add:-1 }}
- 利用
额外优化方案
如果不想在模板里处理计算,也可以在视图层提前给每个订单注入全局ID,让模板逻辑更简洁:
# 视图中给当前页的每个订单添加全局序号 for idx, order in enumerate(page_obj.object_list): order.global_id = page_obj.start_index() + idx
之后在模板里直接调用{{ order.global_id }}即可。
内容的提问来源于stack exchange,提问作者kims9
相关产品推荐
相关产品推荐

