You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django分面筛选后QuerySet未更新,请求排查代码问题

分面筛选导航的代码错误分析

以下是你代码中导致筛选后QuerySet不更新的关键错误,以及对应的修正方案:

1. GET参数名不匹配(模板+视图)

  • 问题:模板里的筛选链接使用的参数名是materiau,但视图中尝试获取的是materiau__nom,两者不匹配,导致视图无法拿到筛选参数,自然不会更新QuerySet。
    • 模板错误代码:
      <a href="?materiau={{ materiau.materiau__nom }}">
      
    • 视图错误代码:
      materiau = self.request.GET.get('materiau__nom')
      
  • 修正:统一参数名为materiau__nom,同时闭合未结束的<a>标签:
    模板修正后:
    <a href="?materiau__nom={{ materiau.materiau__nom }}">{{ materiau.materiau__nom }} ({{ materiau.count }})</a>
    

2. 视图筛选字段错误

  • 问题:视图中用filter(type=materiau)进行筛选,但ObjetArchi模型并没有type字段,正确的关联字段应该是materiau__nom。
    • 错误代码:
      qs = qs.filter(type=materiau)
      
  • 修正:替换为正确的关联筛选:
    qs = qs.filter(materiau__nom=materiau)
    

3. 分面计数的上下文逻辑错误

  • 问题:当前get_context_data中用self.get_queryset()来生成分类计数,而get_queryset()已经是经过筛选的结果,这会导致筛选后其他未选中的分类计数消失,不符合分面导航的预期(应该始终显示所有分类的总计数)。
    • 错误代码:
      context['materiaux'] = self.get_queryset().values('materiau__nom').annotate(count=Count('id'))
      
  • 修正:直接使用模型的原始QuerySet来统计所有分类:
    from django.db.models import Count
    
    context['materiaux'] = ObjetArchi.objects.values('materiau__nom').annotate(count=Count('id'))
    

4. HTML结构错误

  • 问题:模板中每个分类都生成了一个独立的<ul>标签,且<a>标签未闭合,这不仅不符合HTML规范,也会导致页面结构混乱。
    • 错误代码:
      {% for materiau in materiaux %}
          <ul>
              <a href="?materiau={{ materiau.materiau__nom }}">
              {{ materiau.materiau__nom }} ({{ materiau.count }})
          </ul>
      {% endfor %}
      
  • 修正:将<ul>放在循环外部,每个分类作为<li>子元素:
    <ul>
    {% for materiau in materiaux %}
        <li><a href="?materiau__nom={{ materiau.materiau__nom }}">{{ materiau.materiau__nom }} ({{ materiau.count }})</a></li>
    {% endfor %}
    </ul>
    

内容的提问来源于stack exchange,提问作者Mapper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:57:49