有很多帖子和页面讨论 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 中效果不佳。)
原文由 Dashdrum 发布,翻译遵循 CC BY-SA 4.0 许可协议
Django 是一个服务器端应用程序。 Javascript 是客户端。 Django 模板在服务器上呈现,因此
{% url entity_name id_number %}
在服务器端进行评估,然后将其值返回给客户端。正因为如此,你不可能将 Django 模板与 javascript 结合起来。但是,您可以做几件事来解决您的问题。由于您正在进行 ajax 调用,并且 ajax 调用取决于某些用户输入,通常客户端将任何类型的用户输入发送到服务器的最佳途径是使用查询字符串(
?
在 URL 中)或发送POST
数据。因此,最简单的方法是更改您的网址,不要在网址中包含pk
,但要将其作为GET
或POST
的一部分数据。和视图(抱歉,我不熟悉基于类的视图):
在我看来,这是最优雅的解决方案。但是,如果您绝对需要在客户端构建 url,则可以在服务器端生成一个模板 url,然后在客户端替换您需要的任何部分以获得完整的 url。然而,这需要更多的维护,因此更容易出错。这种方法的简单 js 示例: