问题描述 :

  项目中若存在对一段js代码复用多次的时候, 通常将此段代码移动到一个单独的静态文件中在被使用的地方利用 script 标签的 src 属性进行外部调用

  但是如果此文件中存在使用 HTML模板语言中的 {{ }}方式传递相关属性值, 会导致无法正确获取.

问题现象:  

  HTML页面拿到的值为字符串形式 :

问题解决:

  静态js 文件:

 $("#div_digg .action").click(function () {
// 点赞或踩灭
var is_up = $(this).hasClass("diggit");
// 静态文件中的时候,模板语言的地方是无法传递过来值得,根本就没有 render
// var article_id = "{{ article.pk }}";
var article_id = $(".info").attr("article_id"
); $.ajax({
url: "/blog/up_down/",
type: "post",
data: {
is_up: is_up,
article_id: article_id,
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
},
success: function (data) {
console.log(data); if (data.state) {// 赞或者灭成功 if (is_up) {
var val = $("#digg_count").text();
val = parseInt(val) + 1;
$("#digg_count").text(val);
} else {
var val = $("#bury_count").text();
val = parseInt(val) + 1;
$("#bury_count").text(val);
}
}
else { // 重复提交 if (data.fisrt_action) {
$("#digg_tips").html("您已经推荐过");
} else {
$("#digg_tips").html("您已经反对过");
} setTimeout(function () {
$("#digg_tips").html("")
}, 1000) } }
}) })

  HTML文件:

 {% extends 'base.html' %}

 {% block page-main %}

     <div class="article-detail">
<h1>{{ article.title }}</h1>
<p>{{ article.articledetail.content|safe }}</p>
</div> <div id="div_digg">
<div class="diggit action">
<span class="diggnum" id="digg_count">{{ article.up_count }}</span>
</div>
<div class="buryit action">
<span class="burynum" id="bury_count">{{ article.down_count }}</span>
</div>
<div class="clear"></div>
<div class="diggword" id="digg_tips" style="color: red;"></div>
</div> <!--通过标签的自定义属性来传递,让浏览器通过解析html代码拿到想要的值-->
<div class="info" article_id="{{ article.pk }}"></div
> {% csrf_token %}
<!--这样外部引入会导致内部的 模板语言的用法的地方无法拿到值,可以通过标签来传递-->
<script src="/static/js/article_detail.js"></script
> {% endblock %}

 

问题解决原理:

  在js代码中可以使用 {{ }} 的模板语言进行当前页面的相关值操作
    但是必须要在外面加双引号 "{{ }}" 因为这个值的出来之后是 : 羊驼  而不是 "羊驼"
    不带双引号会被认为是没定义的变量名无法操作
  在HTML代码中本来就可以使用 {{ }} 的模板语言进行当前页面的相关值操作
    但是HTML 本身的页面渲染的的值就是不带双引号的,难道你看网页的时候所有的显示都带双引号吗?

  因此在js 代码中使用 {{}} 是完全没有问题的,问题在于当js代码被被存在静态文件的时候.我们需要熟知 web请求 的原理

    • 基于 B/S 的 Django_web 请求在一次请求得到的回应中得益于 render 的渲染, 封装后再回应发出的已经是完整的 html 网页代码,

      •   完整的 页面代码 中的所有的 {{ }} {% %} 相关的代码已经被 render 替换成 相应的值 ,之后剩下的工作就是浏览器的工作了
    •   浏览器需要对 html 代码进行解析渲染成相应的标签及其样式, 对于外部引入的静态文件比如 js , css , 图片 , 等. 浏览器需要进一步的发出请求.
      •   在对静态文件的的请求中, 并不会再有 render 插手的余地了. 即是说 没有render 的参数可以拿来用了, 因此只能以字符串的形式体现在网页中

ps:  

  render 渲染的到底是什么?

  • render渲染的是一个html文件
  • html文件中有什么东西 render 自己是不会在意的而且他也不认识你什么html还是js代码
  • 只 (注意是"只"!) 会将html文件中的所有的{{ }}{% %}的部分进行相应的渲染替换成所传的值

  

  

Django_博客项目 引入外部js文件内含模板语法无法正确获取值得说明和处理的更多相关文章

  1. vue页面引入外部js文件遇到的问题

    问题一:vue文件中引入外部js文件的方法 //在vue文件中 <script> import * as funApi from '../../../publicJavaScript/pu ...

  2. 微信小程序从零开始开发步骤(七)引入外部js 文件

    上一章讲到小程序页面的四种常见的跳转的方法,这一章写如何引入一个外部的js文件,既utils文件夹的用处,其实步骤很简单: 1:准备好外部想要引入的外部文件,命名为util.js,并且填充固定的文件内 ...

  3. html中引入外部js文件,使用外部js文件里的方法

    外部js文件1: /** * 加了window.onload 后,直接引入js文件即可 * 页面资源全部加载完毕后会自动调用window.onload里的回调函数 */ window.addEvent ...

  4. Django_博客项目 注册用户引发 ValueError: The given username must be set

    博客项目中 注册功能在ajax 提交数据时 报错 ValueError: The given username must be set 锁定到错误点为 判定为是无法获取到 username 字段 那先 ...

  5. HTML引入外部JS文件

    <!--引入外部文件的方式--> <script type="text/javascript" src="attack.js">< ...

  6. vue/cli项目添加外部js文件的一个方法

    有一个util.js文件,内容如下 function Util () { ... } export default new Util() 可以在main.js里面通过import引入js import ...

  7. Node.js 从零开发 web server博客项目[express重构博客项目]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  8. Node.js 从零开发 web server博客项目[日志]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  9. Node.js 从零开发 web server博客项目[项目介绍]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

随机推荐

  1. STS-创建spring配置文件

    1.创建一个bean文件 2.输入文件名applicationContext.xml 3.这里会自动显示模板文件 4.创建后,自动填充头不定义 到这里就可以发现,我们创建spring文件时,需要的配置 ...

  2. 20155227《网络对抗》Exp2 后门原理与实践

    20155227<网络对抗>Exp2 后门原理与实践 基础问题回答 (1)例举你能想到的一个后门进入到你系统中的可能方式? 在非官方网站下载软件时,后门很可能被捆绑在软件中. 攻击者利用欺 ...

  3. 20155308 《网络攻防》 Exp2 后门原理与实践

    20155308 <网络攻防> Exp2 后门原理与实践 学习内容:使用nc实现win,mac,Linux间的后门连接 :meterpraeter的应用 :MSF POST 模块的应用 学 ...

  4. Asp.Net StateServer实现共同域名下Session共享

    概述 在实验的时候,参照了多方的信息,确实成功了,这里简单记录一下. 我们知道,在Asp.Net的Web.Config文件中,System.Web节点下,有个sessionState节点,它说明了应用 ...

  5. Qt FFMPEG+OpenCV开启摄像头

    //ffmpegDecode.h #ifndef __FFMPEG_DECODE_H__ #define __FFMPEG_DECODE_H__ #include "global.h&quo ...

  6. 架构师修炼 III - 掌握设计原则

    关于软件的设计原则有很多,对于设计原则的掌握.理解.实践及升华是架构师的一项极为之必要的修炼. 记得在12年前第一次阅读<敏捷开发>时,五大基本设计原则就深深地植入到我的脑海中一直影响至今 ...

  7. Html_兼容性

    那么如何禁止使用IE8兼容模式解析网页呢?在IE8以上版本的浏览器增加了一个X-UA-Compatible 头标记,用于为IE8指定不同的页面渲染模式. <meta http-equiv=&qu ...

  8. 290. Word Pattern【LeetCode by java】

    今天发现LintCode页面刷新不出来了,所以就转战LeetCode.还是像以前一样,做题顺序:难度从低到高,每天至少一题. Given a pattern and a string str, fin ...

  9. Kubernetes并发控制与数据一致性的实现原理

    在大型分布式系统中,定会存在大量并发写入的场景.在这种场景下如何进行更好的并发控制,即在多个任务同时存取数据时保证数据的一致性,成为分布式系统必须解决的问题.悲观并发控制和乐观并发控制是并发控制中采用 ...

  10. DRF01

    1.web应用模式 在web开发中有两种应用模式: 1)前后端不分离 2)前后端分离 2.api接口 为了在团队内部形成共识.防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范, ...