如何将Django中带pk参数的URL传递给JavaScript并解决访问报错
你遇到的问题主要有两处核心错误,分别是Django路由定义不规范,以及JavaScript侧错误使用路由规则字符串作为实际请求地址,可按以下步骤修复:
1. 修复urls.py路由定义
你当前的写法混合了path函数和正则表达式语法,同时存在多余标点、空格等笔误。你的匹配规则是UUID格式的主键,Django自带UUID转换器,不需要手写正则,直接简化为:
from django.urls import path from . import views urlpatterns = [ # 用内置uuid转换器替代手写正则,写法更简洁不易出错 path("chatbot/<uuid:pk>/", views.chatbot, name='chatbot_chatbot'), path("post/<uuid:pk>/", views.chatbot_process, name='post'), path("", views.landing, name='home') ]
如果你确实需要自定义正则,必须使用re_path而非path,同时修正正则中的多余引号、空格问题:
from django.urls import path, re_path from . import views urlpatterns = [ re_path(r"chatbot/(?P<pk>[0-9A-Fa-f]{8}(-[0-9A-Fa-f]{4}){3}-[0-9A-Fa-f]{12})/$", views.chatbot, name='chatbot_chatbot'), re_path(r"post/(?P<pk>[0-9A-Fa-f]{8}(-[0-9A-Fa-f]{4}){3}-[0-9A-Fa-f]{12})/$", views.chatbot_process, name='post'), path("", views.landing, name='home') ]
2. 正确传递URL到JavaScript
Django的路由规则字符串不能直接作为请求地址,你需要将实际的UUID值代入生成真实可访问的URL,有两种常用方案:
方案1:JS代码写在Django模板中
直接使用Django模板的url标签渲染出完整URL:
// 替换代码中的「你的主键变量」为你视图传递到模板的UUID变量 const postUrl = "{% url 'post' pk=你的主键变量 %}"; $.get(postUrl, {input_text: rawText, user_text: new_value}).done(function (data) { const msgText = data; appendMessage(BOT_NAME, BOT_IMG, "left", msgText); });
方案2:JS是独立静态文件
将生成的URL存入HTML元素的data属性,JS侧读取即可:
首先在模板中添加元素存储URL:
<!-- 替换「你的主键变量」为你视图传递的UUID值 --> <div id="api-config" data-post-url="{% url 'post' pk=你的主键变量 %}" style="display: none;"></div>
然后在JS文件中读取:
const postUrl = document.querySelector('#api-config').dataset.postUrl; $.get(postUrl, {input_text: rawText, user_text: new_value}).done(function (data) { const msgText = data; appendMessage(BOT_NAME, BOT_IMG, "left", msgText); });
内容的提问来源于stack exchange,提问作者Vee Jay Tan
相关产品推荐
相关产品推荐

