在AJAX调用中使用Django URL标记

时间:2012-11-12 02:44:22

标签: ajax django

有很多关于Django和AJAX使用的帖子和页面,我在过去一天左右读了数百个,寻找这个问题的答案。快速概述:

示例中的5月显示了这样的硬编码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来说不会很好。)

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:13)

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

由于您正在进行ajax调用,并且ajax调用依赖于某些用户输入,因此通常客户端向服务器发送任何类型的用户输入的最佳路径是使用查询字符串({{1}之后的事物在URL中)或通过发送?数据。最简单的方法是更改​​您的网址,不要在网址中包含POST,而是将视图作为pkGET数据的一部分。

POST

和视图(抱歉,我不熟悉基于类的视图):

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

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

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

答案 1 :(得分:0)

为了获取 URL 而往返服务器非常耗时。保持 URL 干燥并避免这种情况的最佳策略是生成模拟 Django 原生 url reverse 函数的 javascript,然后与客户端 JS 的其余部分静态地提供该代码。

django-render-static 就是这样做的。