在Django模板中如何设置for循环的起始与结束序号范围?
问题修正方案
1 模板层直接修复(快速适配现有代码)
你代码的报错根源是{% if forloop.counter 15>=30 %}判断语法完全错误,Django模板引擎无法解析该表达式。将该行判断修改为如下内容即可实现15~30项的过滤:
{% if forloop.counter >= 15 and forloop.counter <= 30 %}
修正后的完整模板代码如下:
{% for post in posts %} {% if forloop.counter >= 15 and forloop.counter <= 30 %} <div style="background-color: #9999; max-width: 100%;" class="card mb-3"> <div class="row no-gutters"> <div class="col-md-4"> <a href="{% url 'post_detail' post.slug %}"><img style="height: 200px; width: 330px;" src="{{ post.mainimage.url }}" class="card-img" alt="..."></a> </div> <div class="col-md-6" id="ph"> <div class="card-body"> <h5 class="card-title">{{ post.title }} , {{ post.xnumber }}</h5> <p class="card-text">{{ post.version }}</p> <p>{{ post.category }}</p> <p class="card-text"><small class="text-muted">{{ post.date_added }}</small></p> </div> </div> </div> </div> <hr > {% endif %} {% endfor %}
注:原代码中div标签重复定义了style属性,已合并优化
2 更推荐的实现方式(视图层切片,性能更优)
Django模板层不建议做复杂的逻辑判断,你可以直接在视图层对QuerySet做切片处理,提前筛选出15~30项数据,模板不需要额外加判断逻辑,遍历效率更高:
- 视图层代码修改示例:
# 原查询逻辑,比如你原来的查询是 # posts = Post.objects.all() # 修改为如下切片,Python切片左闭右开,索引从0开始,[14:30]对应第15项到第30项 posts = Post.objects.all()[14:30]
- 模板层直接遍历即可,不需要加if判断:
{% for post in posts %} <div style="background-color: #9999; max-width: 100%;" class="card mb-3"> <div class="row no-gutters"> <div class="col-md-4"> <a href="{% url 'post_detail' post.slug %}"><img style="height: 200px; width: 330px;" src="{{ post.mainimage.url }}" class="card-img" alt="..."></a> </div> <div class="col-md-6" id="ph"> <div class="card-body"> <h5 class="card-title">{{ post.title }} , {{ post.xnumber }}</h5> <p class="card-text">{{ post.version }}</p> <p>{{ post.category }}</p> <p class="card-text"><small class="text-muted">{{ post.date_added }}</small></p> </div> </div> </div> </div> <hr > {% endfor %}
内容的提问来源于stack exchange,提问作者7mood
相关产品推荐
相关产品推荐

