Django中Ajax请求未执行urls.py指定的views.py对应函数问题
问题根因
Django的URL路由匹配是从上到下按顺序匹配,命中第一个符合规则的路径就会终止匹配,不会再继续向后查找。你当前的urls.py中,带动态参数的path('<str:scientific>', ...)规则放在了path('update', ...)的前面,当你请求/update路径时,Django会把字符串update识别为scientific参数的值,直接匹配到itemAlt路由,调用当前页面的视图返回HTML,根本不会执行后面的item_update函数。
排查步骤
- 先打开浏览器开发者工具的「网络」标签,找到你发的AJAX请求,确认请求的目标URL确实为
/update,排除前端data-ajax-url渲染错误的问题 - 临时修改
urls.py,把path('update', views.item_update, name='item-update')整行剪切到path('<str:scientific>', views.reptile_itemAlt, name='itemAlt')的前面,重新发送AJAX请求,看是否能正常返回JSON格式数据
最终解决方案
推荐选择以下任意一种方案解决,避免后续再出现类似的路由冲突:
- 调整路由顺序:把所有固定路径的规则(比如
update、edit、search这类没有动态参数的路径)全部放在带动态参数的规则前面,确保固定路径优先被匹配 - 给动态路径加前缀:修改
itemAlt路由规则,增加固定前缀避免和其他路径冲突,示例:path('reptile/<str:scientific>', views.reptile_itemAlt, name='itemAlt'), - 限制动态参数格式:如果你的
scientific参数有固定的格式规则,可以用re_path写正则限制参数格式,避免匹配到update这类固定路径名
验证方法
修改完路由后,可以直接在浏览器地址栏访问/update路径,如果返回的是JSON格式的报错(因为没传POST参数)而不是普通页面HTML,就说明路由已经匹配正确。
内容的提问来源于stack exchange,提问作者Jaromando
相关产品推荐
相关产品推荐

