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
相关产品推荐
相关产品推荐

