小编典典

在AJAX调用中使用Django URL标记

ajax

大量的文章和页面讨论了Django和AJAX的用法,过去一天左右,我读了数百本文章,以寻找该问题的答案。快速概述:

可能的示例显示了这样的硬编码URL:

$.post("/projects/create/", {"name" : name}, function(data) {...

或某些使用URL模板标记,但没有参数的情况:

$.post("{% url create_project %}", {"name" : name}, function(data) {...

但是,我想在URL中包含Django风格的参数。这是我的网址定义:

url(r'ajax/entity_name/(?P<pk>\w+)/$',EntityAjaxView.as_view(),name='entity_name'),

是的,我使用的是基于类的视图,它基于DetailView。默认情况下,此视图查找URL中提供的pk值,在正常模板中,我将使用:

{% url entity_name id_number %}

提供链接。在我的代码中,我想获取在pk值的输入框中输入的值。这是我的JavaScript的代码段(无效):

var id_number = $('#id_endowmententity_set-' + rownum + '-id_number').val()
$.ajax({
    type: "GET",
url: '{% url entity_name id_number %}',

因此,我的问题是,我可以将URL模板标记与输入框中的值一起使用吗?

(我知道我可以使用POST而不是GET并在POST数据中传递id_number,但是在DetailView中不能很好地工作。)

在此先感谢您的帮助。


阅读 458

收藏
2020-07-26

共1个答案

小编典典

Django是服务器端应用程序。Javascript是客户端的。Django模板在服务器上呈现,因此{% url entity_name id_number %}在服务器端进行评估,然后将其值返回给客户端。正因为如此,您不可能将Django模板与javascript结合使用。但是,您可以做一些事情来解决您的问题。

由于您正在进行ajax调用,而ajax调用取决于某些用户输入,因此通常,客户端向Query
Server发送任何类型的用户输入到服务器的最佳途径是使用querystring(?URL中的后面)或通过发送一个POST数据。因此,最简单的方法是更改​​您的网址,而不是pk在网址中包含,而是让视图将其作为GETPOST数据的一部分来获取。

url(r'ajax/entity_name/$', EntityAjaxView.as_view(), name='entity_name'),

和视图(对不起,我不熟悉基于类的视图):

def entity_name(request):
    pk = request.GET.get('pk')
    ...

在我看来,这是最优雅的解决方案。但是,如果绝对需要在客户端上构建URL,则可以在服务器端生成模板URL,然后替换客户端上所需的任何部分以获取完整的URL。但是,这需要更多的维护,因此更容易出错。这种方法的简单js示例:

var id_number = $('#id_endowmententity_set-' + rownum + '-id_number').val(),
    url = '{% url entity_name 0 %}'.replace('0', id_number);
$.ajax({
    type: "GET",
    url: url,
    ...
});
2020-07-26