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

Django搜索栏过滤时遇‘context must be a dict rather than module’错误求助

解决“context must be a dict rather than module”错误及搜索过滤功能问题

你的代码存在几处关键问题,导致了该错误和搜索功能失效,以下是修正方案:

1. 视图层(views.py)核心错误修复

问题点:

  • 未调用父类get_context_data方法初始化上下文字典,直接使用context变量会导致它指向同名模块而非字典对象
  • 获取请求参数的写法错误:self.get.GET应为self.request.GET
  • ListView的搜索过滤逻辑更适合放在get_queryset方法中(Django类视图标准实践)

修正后的views.py代码:

class pplList(LoginRequiredMixin, ListView):
    model = People
    context_object_name = 'people'

    def get_queryset(self):
        # 获取搜索参数,默认空字符串
        search_input = self.request.GET.get('search-area', '')
        # 先获取基础查询集
        queryset = super().get_queryset()
        if search_input:
            # 对姓名进行不区分大小写的模糊过滤
            queryset = queryset.filter(name__icontains=search_input)
        return queryset

    def get_context_data(self, **kwargs):
        # 必须先调用父类方法获取上下文字典
        context = super().get_context_data(**kwargs)
        # 将搜索内容回显到页面输入框
        context['search_input'] = self.request.GET.get('search-area', '')
        return context

2. 模板层(people_list.html)错误修复

问题点:

  • 搜索框的name属性拼写错误:search-are应为search-area,需与后端参数名保持一致

修正后的搜索表单代码:

<form method="get">
    <!-- 回显之前的搜索内容,提升用户体验 -->
    <input type='text' name='search-area' value="{{ search_input }}">
    <input type='submit' value='Search'>
</form>

错误原因说明

原代码中未通过super().get_context_data(**kwargs)初始化context,Python会将未定义的context解析为同名模块,而非ListView所需的上下文字典,因此抛出“context must be a dict rather than module”错误。同时,将过滤逻辑放在get_queryset中是Django ListView处理动态查询的标准方式,比在get_context_data中修改上下文更规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:55:44