Django报get() unexpected keyword argument 'slug'且URL韩文不生效问题
问题根因
两个配置均存在问题,对应报错原因如下:
- slug:slug返回404:Django内置的
slug路径转换器默认仅支持ASCII字符匹配,哪怕模型字段开启了allow_unicode,路由层默认也无法识别韩文字符,导致路由匹配失败返回404。 - str:slug报参数错误:你在路由中配置了
slug路径参数,Django会自动将该参数作为关键字参数传入对应视图的get方法,但你的ReviewListAPI的get方法没有定义接收slug参数的形参,直接触发参数不匹配报错。
解决方案
1. 修复视图层参数接收与业务逻辑
修改views.py中的ReviewListAPI类,新增slug参数接收路由传值,同时补充对应过滤逻辑(你配置带slug的路由目的是筛选对应建筑的评论,因此需要加过滤规则):
from django.shortcuts import get_object_or_404 class ReviewListAPI(APIView): # 新增slug形参接收路由参数 def get(self, request, slug): # 先根据slug查询对应建筑,不存在则直接返回404 target_building = get_object_or_404(BuildingData, slug=slug) # 过滤出该建筑关联的所有评论,此处外键字段名请根据你实际的模型定义修改 queryset = ReviewData.objects.filter(building=target_building) serializer = ReviewSerializer(queryset, many=True) return Response(serializer.data)
2. 路由层支持韩文字符匹配
两种方案可选:
- 直接使用
<str:slug>:简单粗暴,已经可以满足需求,视图修复后不会再报参数错误,韩文可以正常识别。 - 自定义Unicode slug转换器(更规范):相比
str仅匹配符合slug规则的字符,避免无效路径匹配,配置如下:
首先在urls.py头部注册自定义转换器:
之后修改路由规则即可:from django.urls import register_converter class UnicodeSlugConverter: regex = '[-_\w]+' def to_python(self, value): return str(value) def to_url(self, value): return str(value) register_converter(UnicodeSlugConverter, 'uslug')path('api/buildingdata/<uslug:slug>/', ReviewListAPI.as_view())
内容的提问来源于stack exchange,提问作者JYH
相关产品推荐
相关产品推荐

