Django Ajax请求如何拼接含动态参数的URL路径?
问题描述
我有一个用于从Players模型获取所有球员数据的Django Ajax模板,代码如下:
<body> <h1>List of Players:</h1> <ul id="display-data"> </ul> </body> <script> $(document).ready(function(){ setInterval(function(){ $.ajax({ type:"GET", url: "{% url 'getPlayers' %}", // 我觉得问题出在这里 success: function(response){ console.log(response); }, error: function(response){ alert("An error occured") } }); },1000); }) </script>
但我的urls.py中该模板对应的URL是动态路径:
urlpatterns = [ path('<str:league_id>/<str:league_title>/draft/', draft, name='draft'), path('<str:league_id>/<str:league_title>/getPlayers/', getPlayers, name="getPlayers"), ] # 包含的基础路径是 /league/
问题在于Ajax函数中设置的url未包含league_id和league_title参数,请问如何在Ajax的url路径中添加这些参数?或者是否是该问题导致我的配置异常?
对应的views.py代码:
def draft(request, league_id, league_title): league = League.objects.get(id=league_id) context = {'league': league} return render(request, 'league/draft.html', context) def getPlayers(request, league_id): league = League.objects.get(id=league_id) players = league.available_player.all() return JsonResponse({'players': list(players.values())})
解决方案
你的判断完全正确,Ajax请求异常的核心原因就是{% url 'getPlayers' %}没有传入动态URL要求的league_id和league_title参数,Django无法生成合法的URL路径,直接导致请求失败。
下面是两种可行的解决方法:
方法一:利用模板变量生成完整URL
由于draft视图已经将league对象传入模板上下文,直接在Django的url模板标签中传入对应的参数即可:
url: "{% url 'getPlayers' league.id league.title %}",
Django会自动渲染出符合要求的完整URL,比如/league/123/nba/getPlayers/。
方法二:通过JS解析当前URL提取参数
如果不想依赖模板变量,也可以用JavaScript从当前页面URL中解析出所需参数:
// 假设当前页面URL为 /league/123/nba/draft/ const pathSegments = window.location.pathname.split('/'); // 根据实际路径结构调整索引 const leagueId = pathSegments[2]; const leagueTitle = pathSegments[3]; const ajaxUrl = `/league/${leagueId}/${leagueTitle}/getPlayers/`; // 在Ajax请求中使用该URL $.ajax({ type: "GET", url: ajaxUrl, success: function(response){ console.log(response); }, error: function(response){ alert("An error occured") } });
额外修复点
注意你的getPlayers视图存在参数不匹配问题:URL定义了league_id和league_title两个参数,但视图函数只接收league_id,这会触发Django的参数错误。需要修改视图为:
def getPlayers(request, league_id, league_title): league = League.objects.get(id=league_id) players = league.available_player.all() return JsonResponse({'players': list(players.values())})
如果league_title只是URL中的装饰性字段不需要实际使用,可以保留参数但不调用,或者调整URL配置,但必须保证视图参数与URL定义的参数数量一致。
内容的提问来源于stack exchange,提问作者Kaden Miller
相关产品推荐
相关产品推荐

