大量的文章和页面讨论了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中不能很好地工作。)
在此先感谢您的帮助。
Django是服务器端应用程序。Javascript是客户端的。Django模板在服务器上呈现,因此{% url entity_name id_number %}在服务器端进行评估,然后将其值返回给客户端。正因为如此,您不可能将Django模板与javascript结合使用。但是,您可以做一些事情来解决您的问题。
由于您正在进行ajax调用,而ajax调用取决于某些用户输入,因此通常,客户端向Query Server发送任何类型的用户输入到服务器的最佳途径是使用querystring(?URL中的后面)或通过发送一个POST数据。因此,最简单的方法是更改您的网址,而不是pk在网址中包含,而是让视图将其作为GET或POST数据的一部分来获取。
?
POST
pk
GET
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, ... });