Django搜索函数报错:search()收到意外关键字参数'query'求助
解决Django视图函数"got an unexpected keyword argument 'query'"错误
错误原因
你的URL配置里定义了path('search/<str:query>/', views.search, name='search'),这个路径规则会把URL中<str:query>匹配到的内容作为参数传递给search视图函数,但你的search函数只声明了request一个参数,没有接收query参数,因此触发该错误。
两种修复方案
方案1:修改视图函数,接收query参数
如果希望通过URL路径直接传递搜索关键词,调整视图函数,新增query参数并替换原有从GET参数取关键词的逻辑:
def search(request, query): base_url = "http://apis.data.go.kr/5710000/benlService/nltyArtList" image_api_url = "http://apis.data.go.kr/5710000/benlService/artImgList" # 使用URL路径传入的query作为搜索关键词 search_query = query params = { "serviceKey":"gKat/nvnmi8i9zoiX+JsGzCTsAV75gkvU71APhj8FbnH3yX4kiZMuseZunM0ZpcvKZaMD0XsmeBHW8dVj8HQxg==", "pageNo": "1", "numOfRows": "5", "returnType": "json", "artNm": search_query } # 后续原有逻辑保持不变 response = requests.get(base_url, params=params) if response.status_code == 200: data = response.json() art_list = data['response']['body']['items']['item'] for art in art_list: image_params = { "serviceKey":"gKat/nvnmi8i9zoiX+JsGzCTsAV75gkvU71APhj8FbnH3yX4kiZMuseZunM0ZpcvKZaMD0XsmeBHW8dVj8HQxg==", "pageNo": "1", "numOfRows": "5", "returnType": "json", "artNm": art["artNm"] } image_response = requests.get(image_api_url, params=image_params) if image_response.status_code == 200: image_data = image_response.json() if 'item' in image_data['response']['body']['items']: art["image_url"] = image_data["response"]["body"]["items"]["item"]["imgUrl"] else: art["image_url"] = None else: art["image_url"] = None else: print("API请求失败:", response.status_code) art_list = [] return render(request, 'index.html', {'art_list': art_list, 'search_query': search_query})
方案2:修改URL配置,移除路径参数(适配原有视图逻辑)
如果你的搜索逻辑是通过GET参数(如/search/?q=关键词)传递关键词,直接修改URL路径,去掉<str:query>部分:
urlpatterns = [ path('', views.openapi_view, name='index'), # 移除路径中的参数,让视图继续从GET参数q获取关键词 path('search/', views.search, name='search'), ]
这样访问/search/?q=山水画时,视图就能正常从request.GET.get('q')拿到搜索关键词,不会再传递额外的query参数。
额外优化建议
- 把API密钥迁移到Django的
settings.py中,避免硬编码:# settings.py API_SERVICE_KEY = "你的密钥内容" # 视图中引用 from django.conf import settings params = { "serviceKey": settings.API_SERVICE_KEY, # 其他参数... } - 处理API返回数据时,改用
get()方法避免KeyError,比如:art_list = data.get('response', {}).get('body', {}).get('items', {}).get('item', [])
内容的提问来源于stack exchange,提问作者haenshi
相关产品推荐
相关产品推荐

