在Django中实现Listing过滤器时出现最大递归深度错误的问题求助
解决Django模板递归深度错误问题
你遇到的最大递归深度错误原因非常明确,咱们直接定位问题核心:
问题根源
在你的detailed2.html模板中,有一行代码触发了无限递归:
{% include "detailed2/detailed2.html" %}
这相当于让当前模板在渲染时不断加载它自己,每一次包含都会重新执行模板逻辑,循环往复直到达到Python的递归深度上限,最终抛出错误。
解决步骤
1. 拆分模板,创建单独的列表项组件
你需要把单个detaileditems对象的渲染逻辑抽成独立的子模板,比如在detailed2模板文件夹下新建listing_item.html,内容示例如下:
<!-- templates/detailed2/listing_item.html --> <div class="card h-100"> <img src="{{ listing.image.url }}" class="card-img-top" alt="{{ listing.title }}"> <div class="card-body"> <h5 class="card-title">{{ listing.title }}</h5> <p class="card-text">{{ listing.body|truncatewords:20 }}</p> <p class="card-text"><small class="text-muted">类型: {{ listing.type }} | 发布时间: {{ listing.pubdate|date:"Y-m-d" }}</small></p> </div> </div>
你可以根据实际需求调整布局和展示字段。
2. 修改主模板引用正确的子模板
回到detailed2.html,把原来的递归包含语句替换成新的子模板,顺便修正了row-cols-sm2的拼写错误:
<div class = "col-lg-6 col-md-8 mx-auto"> <form method = "get"> {{ listing_filter.form }} <button class="btn btn-sm btn-danger" type="submit">Search</button> </form> </div> <div class = "container"> <div class = "row row-cols-1 row-cols-sm-2 row-cols-md-3 g-3"> {% for listing in listing_filter.qs %} <div class = "col"> {% include "detailed2/listing_item.html" %} </div> {% endfor %} </div> </div>
3. 可选:优化视图代码
你的视图里定义的items = detaileditems.objects其实没有被模板使用(模板用的是listing_filter.qs),可以简化视图逻辑:
from .models import detaileditems from .filters import ListingFilters def alldetailed2(request): listing_filter = ListingFilters(request.GET, queryset=detaileditems.objects.all()) context = { 'listing_filter': listing_filter, } return render(request, 'detailed2/detailed2.html', context)
这样调整后,模板就不会再递归调用自己,django-filters的过滤逻辑也能正常工作了。
内容的提问来源于stack exchange,提问作者soumik chakraborty
相关产品推荐
相关产品推荐

