当使用模板和 django 的变量时,如何将 js 文件移出模板?

How to move js file out of a template when it uses template's and django's variables?

大多数在JS中使用django变量的SO例子都在JS中HTML。 我试图将 JS 放在一个单独的文件中,但它停止工作了。当我在模板中使用 JS

{% url "distributors:search_dist" %}

工作正常,它使我移动到 distributors/search_dist,但是当我尝试使用单独的 JS 文件时,它使我移动到 %7B%%20url%20%22distributors:search_dist%22%20%%7D

有什么方法可以解决此问题?

js 将无法计算 {% url "distributors:search_dist" %}。它的目的不是到达客户端。它旨在由 django 在服务器端进行评估。

你可以做的是将 {% url "distributors:search_dist" %} 放在 html 中:

<script>
   var url = {% url "distributors:search_dist" %};
</script>

var url 将被 js 可见

您可以在模板中设置全局 JS 变量。

<script>
    var URL = {% url "distributors:search_dist" %};
</script>

现在你的全局变量之后加载你的 JS 文件。

<script src="path/to/file.js"></script>

我通常会在我的基本模板中设置一个应用程序范围的对象,如果需要,您可以在其他模板中对其进行扩展:

# base.html (upper-most HTML template)

. . .
    <script>
        var myApp = {
                staticUrl: '{{ STATIC_URL }}',
                distributorsSearchDistUrl: '{% url "distributors:search_dist" %}'
            }
    </script>
</body>

然后您可以在其他模板中访问它们,前提是它们扩展 base.html 或包含在扩展 base.html 的模板中。从那里您可以访问 JavaScript 中可能包含的变量:

# some_page.html

{% extends 'base.html' %}

{% block js %}
    <script src="extra.js"></script>
{% endblock %}


# extra.js

'use strict';

console.log(myApp.staticUrl);

您始终可以使用可能特定于视图的附加值在模板中扩展此对象:

# another-template.html

{% extends 'base.html' %}

{% block js %}
    {{ block.super }}

    <script>
        myApp['someValue'] = '{{ variableFromTheView }}';
    </script>

    <script src="extra.js"></script>
{% endblock js %}