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

