Django Admin联动下拉框报405 Method Not Allowed错误求助
排查Django Admin联动下拉框的405 Method Not Allowed错误
1. 视图权限配置拼写错误
你的DistrictList视图里把permission_classes拼写成了permission_classed,这个错误会导致视图配置异常,先修正:
class DistrictList(APIView): permission_classes = [IsAuthenticated,] # 修正拼写错误 def post(self, request, format=None): # 原有逻辑代码...
2. URL路由匹配验证
打开浏览器开发者工具的Network标签,查看触发请求的实际信息:
- 确认请求URL是否和你配置的
/school/districts/完全匹配,如果项目主路由里没有把app路由挂载到/school/路径下,JS里的URL应该改为/districts/ - 确认请求方法确实是POST,避免因为URL末尾缺斜杠被Django自动重定向为GET请求
3. 反向关联查询逻辑修正(潜在后续问题)
虽然当前是405错误,但你的视图查询逻辑存在bug:District模型的province外键未设置related_name='districts',默认反向关联名称是district_set,不修正后续会抛出属性错误:
# 方式1:修正查询代码 districts=Province.objects.get(id=province).district_set.all() # 方式2:给ForeignKey添加related_name,保留原有查询逻辑 class District(models.Model): province = models.ForeignKey( Province, on_delete=models.CASCADE, related_name='districts' # 添加此行 ) # 其他字段...
4. CSRF Token传递检查
虽然CSRF错误通常表现为403,但也可以在开发者工具的Request Headers里确认X-CSRFToken是否存在且值正确。如果cookie获取失败,可以尝试从页面DOM中直接提取CSRF token:
// 替换原getCookie方法,从页面隐藏input获取token const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
5. 临时切换GET方法排查
如果以上检查都没问题,可以临时修改视图和JS,用GET方法测试是否能正常响应,判断是否是POST请求被拦截:
# 视图添加GET方法 class DistrictList(APIView): permission_classes = [IsAuthenticated,] def get(self, request, format=None): province=request.GET.get('province') district={} if province: districts=Province.objects.get(id=province).district_set.all() district={p.name:p.id for p in districts} return JsonResponse(data=district, safe=False)
// JS修改请求方法 $.ajax({ url: "/school/districts/", type:"GET", // 改为GET data:{province: $(this).val(),}, // 其他配置... });
内容的提问来源于stack exchange,提问作者Anee Mes
相关产品推荐
相关产品推荐

