【问题标题】:Call django urls inside javascript on click event点击事件在javascript中调用django url
【发布时间】:2016-09-15 14:45:22
【问题描述】:

我在模板中得到了一个 javascript onclick 事件,我想从中调用一个带有 id 参数的 Django url,如下所示:

$(document).on('click', '.alink', function () {
        var id = $(this).attr('id');
        document.location.href ="{% url 'myapp:productdetailorder' id %}"
});

当然这根本行不通。有什么想法吗?

提前致谢!!

【问题讨论】:

  • 你的目标到底是什么? Django 模板标签中引用的变量id 与javascript 中的变量不同。在 javascript 中使用 Django 模板通常会产生不优雅的代码,但听起来您想要做的实际上是在 javascript 中执行字符串连接。将 Django 标签想象为一个返回字符串的函数,并编写相应的 javascript 进行连接。
  • 嗨,感谢您的评论,这是我想为 url 设置的产品 ID,以便我的视图可以处理它并在另一个模板中显示它的信息。我知道我可能做错了,但这正是我需要的:一个很好的方法
  • 相关的 URL 似乎指向您 API 中的端点。您通常会将此 URL 硬编码到您的 javascript 代码中,因为 API 不是动态的,除非您对其进行更改,否则应该保持稳定。所以,我建议在你的 javascript 代码中写出 URL。

标签: javascript jquery django location-href


【解决方案1】:

我认为最好的方法是创建一个带有在模板中呈现的 URL 的 html data-* 属性,然后使用 javascript 来检索它。

这样可以避免将 js/django 模板内容混合在一起。此外,我将所有 JS 保存在视图之外的单独文件中(这通常是一种更好的做法),因此尝试混合这两者是行不通的。

例如,如果你有一个你想要的 url,只需创建一个 html 隐藏元素:

<input type="hidden" id="Url" data-url="{% url 'myapp:productdetail' id %}" />

然后,在你的 JS 中:

$(document).on('click', '.alink', function () {
    var url = $("#Url").attr("data-url");
});      

我经常将这种模式用于下拉列表,这样我就不必在第一次呈现页面时提供所有选项(这通常会加快速度)。

【讨论】:

【解决方案2】:

您正在尝试访问在用户单击后端 Django 模板中的前端时创建的 javascript 变量。但是,你已经知道这行不通了。

更好的选择是在 javascript 中重建 url:

$(document).on('click', '.alink', function () {
    // Generate URL without "id" bit
    var url = "{% url 'myapp:productdetail' %}";

    var id = $(this).attr('id');

    // Construct the full URL with "id"
    document.location.href = url + "/" + id;
});

如果您没有可以返回所需 URL 的 django url 帮助程序,则可以打印出任何内容并简单地用 javascript 替换它,如下所示:

$(document).on('click', '.alink', function () {
    var url = "{% url 'myapp:productdetail' 123 %}";
    var id = $(this).attr('id');

    // Construct the full URL with "id"
    document.location.href = url.replace('123', id);
});

【讨论】:

  • 感谢您的回答,我知道我们已经很接近了,但是这样做会引发反向 url 错误:使用参数 '()' 和关键字参数 '{}' 反转 'productdetail'未找到。尝试了 1 种模式:['myapp/product/(?P\\d+)/$'] .....我认为这是因为从一开始就需要 id 参数,你怎么看?
  • 是的,这就是 django 的路由助手。只需调用另一个 url 助手来打印您需要的值。如果您没有,那么您可以使用任何 id 打印并在 js 中替换它。我会更新我的答案。
  • 使用 {% url %} 或任何其他可能添加用户数据的标签容易受到 XSS 攻击 - 在模板中将数据传递给 JavaScript 的安全方法是 json_script 过滤器:docs.djangoproject.com/en/3.0/ref/templates/builtins/…
  • @AdamJohnson 我阅读了链接,但由于我缺乏知识和无知,无法理解如何以更安全的方式实现上述目标。那么你能写出代码来说明如何做到这一点。而这一切都必须在 内完成。这些值不能在模板内分配,但 JS。谢谢
【解决方案3】:

问题似乎在于您在 js 静态文件中使用 django 模板语言(我说的对吗?) 尝试将该变量移动到 html 模板文件,例如:

<script type=text/javascript>
var a = "{% url'myapp:productdetail' id %}" </script>

在静态js文件中:

document.location.href = a;

【讨论】:

    【解决方案4】:

    您可以使用 javascript 代码“window.location.origin”,这将给出基本 url,然后您可以添加“/pathname”

    【讨论】:

      【解决方案5】:

      你不需要通过任何...

      写。

       location.href = "/" + id
      

      就是这样。

      【讨论】:

      • 在接受的答案中:document.location.href = url + "/" + id; 这不是基本一样的想法吗?
      • 不太一样....而且更短。而且那个不太可能在永恒的 JavaScript 中工作。
      猜你喜欢
      • 2016-04-15
      • 2022-08-02
      • 2011-01-23
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 2020-05-19
      • 1970-01-01
      相关资源
      最近更新 更多