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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:08:10