首页 > 解决方案 > 如何在 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 提供参数。我该如何解决?

标签: pythondjango

解决方案


是的,你是对的,错误出现在get_cc_details. 您的 URLcc_details被定义为在其路径中有一个整数。当您使用模板标签生成 URL 时,那段代码不知道您将整数附加到末尾。您需要将它作为参数包含在模板标签中。在不知道页面上发生的细节的情况下,我猜您get_cc_detailscc其作为参数,因为您不知道cc页面加载时想要什么值,这很重要,因为那是 Django 呈现该 URL 的时候。

您需要按照以下方式做一些事情:

url_string = {% absurl 'core:analyzer:cc_details' foobar %};
url = new URL(url_string.replace("foobar", cc));

不幸的是,没有这种解决方法就无法使用 Django 模板标签,因为模板标签只会在页面首次加载时进行评估。所以,如果你想要一个动态值,你要么需要这样做,要么创建另一个不带参数的 URL 仅用于呈现(在这种情况下,你当前的代码可以工作),但在这种情况下,你也必须添加错误处理以处理出现在该 URL 上但不包含cc参数的人。


推荐阅读