【问题标题】:Defining Django context variable in Jquery giving me error?在 Jquery 中定义 Django 上下文变量给我错误?
【发布时间】:2013-08-22 07:30:44
【问题描述】:

我正在尝试在我的 jquery 脚本中使用 django 上下文变量。

首先,这个作品:

index.html

<head>
    <script type="text/javascript">
        var page_size = {{page_obj.paginator.num_pages}};
    </script>

    <script type="text/javascript" src="{% static 'js/paginate.js' %}"></script>
</head>

js/paginate.js

$(document).ready( function() {
    alert(page_size);                           //THIS WORKS!!!
});



但是,我不希望用户能够查看我的变量,所以我只是在“paginate.js”文件中添加了全局变量声明:

index.html

<head>
    <script type="text/javascript" src="{% static 'js/paginate.js' %}"></script>
</head>

js/paginate.js

var page_size = {{page_obj.paginator.num_pages}};              //Exactly the same as the above!!

$(document).ready( function() {
    alert(page_size);                           //ERROR!!!
});


奇怪的是,这给了我一个错误:

SyntaxError: invalid property id
    var page_size = {{page_obj.paginator.num_pages}};

我不知道为什么第一个有效,而第二个给我一个错误,因为它们完全相同......也许是因为我是第二个是 Jquery 中的声明..??有什么想法吗??

谢谢..

【问题讨论】:

  • static 表示“恒定”。静态不是模板,它只是一个没有代码或变量的文件。您应该了解“包含”:docs.djangoproject.com/en/dev/ref/templates/builtins/#include
  • 不知道为什么您认为将声明放在单独的文件中意味着用户将无法查看您的变量,或者您为什么认为首先需要这样做。
  • 此外,这被认为是一种非常糟糕的做法,因此再次强调它是轻描淡写的。您提供的 javascript 文件 DOES NOT 会通过任何 Django 处理器,以便了解模板上下文,此外,只需将您的 javascript 变量添加到新的 javascript 文件中,我仍然可以检查文件并查看您的变量。 (即,这产生封装)。
  • @limelights 所以你的意思是我根本不应该在 JS 文件中使用 django 变量??
  • @limelights 当你说“这被认为是一种非常糟糕的做法”时,你指的是什么......?

标签: javascript jquery django


【解决方案1】:

TL;DR

您不能将变量传递给静态文件,因为它们不会被 Django 模板处理器解析。

说明

您的第一个示例有效,因为您在模板中设置了{{ page_obj.paginator.num_pages }},该模板将被解析并转换为数字。当您使用 Django 返回模板时(通过任何 render 方法),只会呈现模板。模板中链接的 CSS 和 Javascript 称为 静态文件:这意味着它们是 Django 模板处理器不会读取的资源。

假设您想将变量插入页面的 img 中。这有什么意义吗?不?但是,这是相同的行为。

那该怎么做呢?

您可以通过 Javascript 文件中的 AJAX 请求获取数据(警告: 此处对您的情况来说有点矫枉过正),或者使用您的第一种方法。

相关话题:

【讨论】:

    【解决方案2】:

    在 Django 中,如果我们需要将变量从视图传递到 JS/html 文件,我们必须确保该文件被 django 模板引擎解析。换句话说,文件必须由 Django 提供。

    而在这里,包含的 Javascript 没有被服务器上的 Django 模板处理器处理,所以这不起作用。

    如果您需要传递要在 JS 文件中使用的模板变量,那么您必须使用问题中提到的第一种方法,即创建一个小的 &lt;script&gt; 块,其中声明了一些全局变量以包含这些模板变量。然后,任何 JS 文件都可以通过查找全局 js 变量来获取值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 2012-01-30
      相关资源
      最近更新 更多