我正在尝试创建一个接受参数cc
的API端点。
模块api
中此端点的视图为:
def cc_details(request, cc):
return JsonResponse({'cc': cc})
URL为:
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)
}
返回绝对URL的自定义absurl
是:
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参数。我该如何解决?
答案 0 :(得分:0)
是的,错误的是get_cc_details
中的URL。您的网址cc_details
被定义为路径中包含整数。当您使用template标记生成URL时,这段代码不知道您要将整数附加到末尾。您需要将其包括为argument in the template tag。我不知道页面上正在发生的事情的细节,我猜您有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
参数的人。