【问题标题】:How to pass Django data to an external JS file?如何将 Django 数据传递给外部 JS 文件?
【发布时间】:2018-01-25 02:43:29
【问题描述】:

我正在做一个 Django 项目。我想将 Django 的 views.py 中的数据传递到 javascript 文件中,运行 js 函数,然后将返回值呈现到我的 html 页面中。我没有在这个项目中使用表格。有人可以指导我如何解决这个问题吗?我在这里看到的大多数答案目前都已过时,我尝试了不同的方法但没有运气。我正在使用 Python v2.7。先感谢您!

【问题讨论】:

    标签: javascript python django python-2.7 django-views


    【解决方案1】:

    我推荐json_script

    这是一个例子。我在views.py中的代码

    def countymap(request):
        json_data = open('home/static/GEOJSON/NECounties2.geojson')
        countyData = json.load(json_data)
        return render(request, 'home/Countymap.html',
                      {'countyData': countyData})
    

    在我的 HTML 中,我使用 json_script 来获取数据并为其分配一个 id。此外,还有一个单独的 Javascript 文件(我们称之为 Countymap)

    <html>
    blah blah blah
    {{ countyData | json_script:"county-data" }}
    <script type="text/javascript" src='{% static "js/Countymap.js" %}'></script>
    <html>
    

    在 Countymap javascript 中,使用它来获取数据

    var countyData = JSON.parse(document.getElementById('county-data').textContent);
    

    希望它仍然有帮助

    【讨论】:

    • 在这种情况下,countyData 的值显示在模板中,想法是不显示此
    【解决方案2】:

    直接在页面模板上的&lt;script&gt; 标记内呈现javascript 数据可能是个好主意。如果要在多个页面中使用,请确保将其包含在基本模板中或使用 include 导入。

    您的视图可能类似于标准 django 视图:

    def detail(request, poll_id):
        try:
            p = Poll.objects.get(pk=poll_id)
        except Poll.DoesNotExist:
            raise Http404("Poll does not exist")
        return render(request, 'polls/detail.html', {'poll': p})
    

    模板将添加一些逻辑来构建 javascript 对象:

    <script>
    var questionset = {
        {% for q in poll.question_set %}
            q.id : {
                "title": "{{ q.title }}",
                "score": {{ q.score }}
            }
            {% if not loop.last %},{% endif %}
        {% endfor %}
    }
    </script>
    

    您现在可以在模板中使用一个 javascript 对象,该对象是根据数据动态构建的。你可以随意使用它:

    <script>
        function doSomething(questionset){
            ...
        }
    </script>
    

    有多种方法可以将您的数据保存到 javascript 文件中,但请记住,这会被客户端的浏览器缓存。在其中包含动态数据不是一个好主意。

    【讨论】:

    • 我的 django 技能有点生疏,所以请在使用前仔细检查我的代码。任何更正表示赞赏。
    • 嗨罗伊!谢谢你的评论。我会玩弄这段代码,如果有什么更新你:)
    • Roy,我避免在我的 html 文件中添加 成功地将“my_var”存储到我的 html 文件中,如何将变量“a”传递给外部 .js 文件?
    • @Marvin 有两种方法:1) 确保将自定义的&lt;script&gt; 放在导入外部文件的&lt;script&gt; 之前。这样您就可以在外部文件中使用该变量。 2) 你在最底部添加了一个额外的&lt;script&gt;,它使用你提供的变量从外部文件调用函数。
    • @Marvin 我更喜欢第二种方法,因为它可以保持外部文件更干净。这些通常是为了重复使用。
    【解决方案3】:

    如果您的项目使用Jinja 或其他模板引擎,您可以尝试将数据传递到模板中。

    Writing your first Django app, part 3 上找到了这个位并对其进行了一些调整。

    def index(request):
        template = loader.get_template('app/index.html')
        my_data = ['whatever your data is']
        context = {
            'my_data': my_data,
        }
        return HttpResponse(template.render(context, request))
    

    在 index.html 中

    <html>
        <head>
            // import jQuery
        </head>
        <body>
            <div id='my_data_label'></div>
            <script type="text/javascript">
                var my_data = "{{ my_data }}"; // gets set by jinja
                $('.my_data_label').text(my_data);
                // do whatever with the data
            </script>
        </body>
    </html>
    

    不确定这是否正是您正在寻找的,但希望对您有所帮助。

    【讨论】:

    • 天哪,谢谢!我忘记将“my_data”传递给上下文。您知道我可以将“my_data”传递到 .js 文件的方法吗?另外,如果我走这条路,如果我传递超过 1 个变量会不会有问题?再次感谢! :)
    • 请参阅上面的评论,了解如何将变量与外部 javascript 文件一起使用(剧透:这很容易)。您使用的对象数量当然没有限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2018-02-23
    • 2021-12-24
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多