如何在Django模板中正确为网址提供参数?

时间:2019-07-08 15:03:13

标签: python django

我正在尝试创建一个接受参数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参数。我该如何解决?

1 个答案:

答案 0 :(得分:0)

是的,错误的是get_cc_details中的URL。您的网址cc_details被定义为路径中包含整数。当您使用template标记生成URL时,这段代码不知道您要将整数附加到末尾。您需要将其包括为argument in the template tag。我不知道页面上正在发生的事情的细节,我猜您有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参数的人。