javascript - Django 1.10 - 使用 django.shortcuts.render 生成带有变量的网页,其中包含 javascript 作为参数

标签 javascript python html django

我是 Django 新手,正在尝试将我构建的网站迁移到 Django 应用程序。 我已经生成了一个 HTML 模板,我想在该模板上根据请求的 URL 呈现动态内容。 HTML 模板如下所示:

{% load staticfiles%}

<!DOCTYPE html>
<html lang="en">
<head>
    <script type="text/javascript">
    {{ script }}
    </script>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="{% static 'styles.css' %}"/>
    <title>{{ title }}</title>
</head>
<body>
<header>
    <h1>{{ title }}</h1>
</header>    
<section>
    <p>
        {{ date }}<br/><br/>
        SiteID: {{ site }}
        <br/>
        -----------------
    </p>
</section>
</body>
</html>

在我的views.py 文件中,我使用此方法生成 URL(例如):

def site(request):
    return render(request, "sites/site.html", {'date': strftime("%A, %B %d %Y"),
                                               'site': '123456',
                                               'title': 'Test',
                                               'script': "window.lpTag=window.lpTag||{};if(typeof window.lpTag._tagCount==='undefined'){window.lpTag={site:'123456'||'',section:lpTag.section||'',autoStart:lpTag.autoStart===false?false:true,ovr:lpTag.ovr||{},_v:'1.6.0',_tagCount:1,protocol:'https:',events:{bind:function(app,ev,fn){lpTag.defer(function(){lpTag.events.bind(app,ev,fn);},0);},trigger:function(app,ev,json){lpTag.defer(function(){lpTag.events.trigger(app,ev,json);},1);}},defer:function(fn,fnType){if(fnType==0){this._defB=this._defB||[];this._defB.push(fn);}else if(fnType==1){this._defT=this._defT||[];this._defT.push(fn);}else{this._defL=this._defL||[];this._defL.push(fn);}},load:function(src,chr,id){var t=this;setTimeout(function(){t._load(src,chr,id);},0);},_load:function(src,chr,id){var url=src;if(!src){url=this.protocol+'//'+((this.ovr&&this.ovr.domain)?this.ovr.domain:'lptag.liveperson.net')+'/tag/tag.js?site='+this.site;}var s=document.createElement('script');s.setAttribute('charset',chr?chr:'UTF-8');if(id){s.setAttribute('id',id);}s.setAttribute('src',url);document.getElementsByTagName('head').item(0).appendChild(s);},init:function(){this._timing=this._timing||{};this._timing.start=(new Date()).getTime();var that=this;if(window.attachEvent){window.attachEvent('onload',function(){that._domReady('domReady');});}else{window.addEventListener('DOMContentLoaded',function(){that._domReady('contReady');},false);window.addEventListener('load',function(){that._domReady('domReady');},false);}if(typeof(window._lptStop)=='undefined'){this.load();}},start:function(){this.autoStart=true;},_domReady:function(n){if(!this.isDom){this.isDom=true;this.events.trigger('LPT','DOM_READY',{t:n});}this._timing[n]=(new Date()).getTime();},vars:lpTag.vars||[],dbs:lpTag.dbs||[],ctn:lpTag.ctn||[],sdes:lpTag.sdes||[],ev:lpTag.ev||[]};lpTag.init();}else{window.lpTag._tagCount+=1;}"})

问题是,这个方法实际上渲染了我的所有字符串,因此它转义了撇号 (') 等字符,这导致 JavaScript 无法工作。这就是我在运行页面时在浏览器控制台中看到的内容:

<script type="text/javascript">
window.lpTag=window.lpTag||{};if(typeof window.lpTag._tagCount===&amp;#39;undefined&#39;){window.lpTag={site:&#39;123456&#39;||&#39;&#39;,section:lpTag.section||&#39;&#39;,autoStart:lpTag.autoStart===false?false:true,ovr:lpTag.ovr||{},_v:&#39;1.6.0&#39;,_tagCount:1,protocol:&#39;https:&#39;,events:{bind:function(app,ev,fn){lpTag.defer(function(){lpTag.events.bind(app,ev,fn);},0);},trigger:function(app,ev,json){lpTag.defer(function(){lpTag.events.trigger(app,ev,json);},1);}},defer:function(fn,fnType){if(fnType==0){this._defB=this._defB||[];this._defB.push(fn);}else if(fnType==1){this._defT=this._defT||[];this._defT.push(fn);}else{this._defL=this._defL||[];this._defL.push(fn);}},load:function(src,chr,id){var t=this;setTimeout(function(){t._load(src,chr,id);},0);},_load:function(src,chr,id){var url=src;if(!src){url=this.protocol+&#39;//&#39;+((this.ovr&amp;&amp;this.ovr.domain)?this.ovr.domain:&#39;lptag.liveperson.net&#39;)+&#39;/tag/tag.js?site=&#39;+this.site;}var s=document.createElement(&#39;script&#39;);s.setAttribute(&#39;charset&#39;,chr?chr:&#39;UTF-8&#39;);if(id){s.setAttribute(&#39;id&#39;,id);}s.setAttribute(&#39;src&#39;,url);document.getElementsByTagName(&#39;head&#39;).item(0).appendChild(s);},init:function(){this._timing=this._timing||{};this._timing.start=(new Date()).getTime();var that=this;if(window.attachEvent){window.attachEvent(&#39;onload&#39;,function(){that._domReady(&#39;domReady&#39;);});}else{window.addEventListener(&#39;DOMContentLoaded&#39;,function(){that._domReady(&#39;contReady&#39;);},false);window.addEventListener(&#39;load&#39;,function(){that._domReady(&#39;domReady&#39;);},false);}if(typeof(window._lptStop)==&#39;undefined&#39;){this.load();}},start:function(){this.autoStart=true;},_domReady:function(n){if(!this.isDom){this.isDom=true;this.events.trigger(&#39;LPT&#39;,&#39;DOM_READY&#39;,{t:n});}this._timing[n]=(new Date()).getTime();},vars:lpTag.vars||[],dbs:lpTag.dbs||[],ctn:lpTag.ctn||[],sdes:lpTag.sdes||[],ev:lpTag.ev||[]};lpTag.init();}else{window.lpTag._tagCount+=1;}
</script>

所以我的问题是 - 如何生成一个动态页面,将实际的 JavaScript 代码作为变量获取,而不渲染代码? (请记住,我还传输一些简单的文本,例如页面标题,因此无论如何我都需要渲染页面)。

谢谢!

最佳答案

您应该将该脚本放在单独的文件中,然后将文件名传递给模板。

将脚本放入 js 文件中,例如 my_script.js:

window.lpTag=window.lpTag||{};if(typeof window.lpTag._tagCount==='undefined') ...

那么在你看来:

def site(request):
    return render(request, "sites/site.html", {'date': strftime("%A, %B %d %Y"),
                                               'site': '123456',
                                               'title': 'Test',
                                               'script': 'my_script.js'})

然后在您的 HTML 中:

<head>
    <script type="text/javascript" src="{{ script }}"></script>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="{% static 'styles.css' %}"/>
    <title>{{ title }}</title>
</head>

关于javascript - Django 1.10 - 使用 django.shortcuts.render 生成带有变量的网页,其中包含 javascript 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39393785/

相关文章:

python - conda环境不读取依赖项

javascript - Graphql shield 返回 Not Authorized for allowed mutation

javascript - 如何在 SnapshotStore 中水合项目名称

Python:将浮点范围[0.0,1.0]映射到颜色范围[红色,绿色]?

javascript - jQuery 在单击按钮时将 php 文件中的值加载到 html 输入中 - 不起作用

html - 标签在列表标签​​中掉落

html - anchor 按钮需要边距

javascript - 如何删除 FOR EACH 循环中的第一个和最后一个值?

c# - PageMethod 无法调用 C# 函数

python - 基于 Pandas 数据框中列比较的条件累积和