python - 如何在 Django 模板中正确地为 URL 提供参数?
问题描述
我正在尝试创建一个接受参数的 API 端点cc
。
模块中此端点的视图api
是:
def cc_details(request, cc):
return JsonResponse({'cc': cc})
网址是:
urlpatterns = [
path('api/cc_details/<int:cc>', api.cc_details, name='cc_details'),
]
我正在从模板中调用 URL,如下所示:
async function get_cc_details(cc) {
let url = new URL("{% absurl 'core:analyzer:cc_details' %}" + "/" + cc)
const response = await fetch(url)
const json = await response.json()
console.log(json)
}
absurl
返回绝对 URL的自定义是:
from django import template
from django.shortcuts import reverse
register = template.Library()
@register.simple_tag(takes_context=True)
def absurl(context, view_name):
request = context['request']
return request.build_absolute_uri(reverse(view_name))
但是,当我尝试导航到我的应用程序的索引页面时,我收到以下错误:
django.urls.exceptions.NoReverseMatch:“cc_details”的反向,没有找不到参数。尝试了 1 种模式:['api/cc_details/(?P[0-9]+)$']
例如,如果我只是手动转到它会正常工作http://127.0.0.1:8000/api/cc_details/123
。
我的猜测是我没有正确地为 JS 函数中的 URL 提供参数。我该如何解决?
解决方案
是的,你是对的,错误出现在get_cc_details
. 您的 URLcc_details
被定义为在其路径中有一个整数。当您使用模板标签生成 URL 时,那段代码不知道您将整数附加到末尾。您需要将它作为参数包含在模板标签中。在不知道页面上发生的细节的情况下,我猜您get_cc_details
将cc
其作为参数,因为您不知道cc
页面加载时想要什么值,这很重要,因为那是 Django 呈现该 URL 的时候。
您需要按照以下方式做一些事情:
url_string = {% absurl 'core:analyzer:cc_details' foobar %};
url = new URL(url_string.replace("foobar", cc));
不幸的是,没有这种解决方法就无法使用 Django 模板标签,因为模板标签只会在页面首次加载时进行评估。所以,如果你想要一个动态值,你要么需要这样做,要么创建另一个不带参数的 URL 仅用于呈现(在这种情况下,你当前的代码可以工作),但在这种情况下,你也必须添加错误处理以处理出现在该 URL 上但不包含cc
参数的人。
推荐阅读
- sql-server - SQL Server 中的 SSIS 列映射问题
- php - 构造函数注入 vs setter 工厂
- video - 取消暂停后如何检测 MediaStreamTrack 是否有“真实”数据?
- python-3.x - 混淆矩阵错误:实际值和预测值之间的数据类型不匹配
- angular - 类型与 Firestore 观察者不匹配
- pandas - Python将值从DataFrame传递到另一个
- sql - 所有迁移工作不正常
- node.js - 删除命令后,MS Teams Bot 继续显示命令
- javascript - JavaScript 验证选择框
- javascript - 复制文本时出现意外结果