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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:37:44