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

问题描述 :

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

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

问题现象:  

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

问题解决:

  静态js 文件:

 1 $("#div_digg .action").click(function () {
 2     // 点赞或踩灭
 3     var is_up = $(this).hasClass("diggit");
 4     // 静态文件中的时候,模板语言的地方是无法传递过来值得,根本就没有 render
 5     // var article_id = "{{ article.pk }}";
 6     var article_id = $(".info").attr("article_id");
 7
 8     $.ajax({
 9         url: "/blog/up_down/",
10         type: "post",
11         data: {
12             is_up: is_up,
13             article_id: article_id,
14             csrfmiddlewaretoken: $("[name=‘csrfmiddlewaretoken‘]").val(),
15         },
16         success: function (data) {
17             console.log(data);
18
19
20             if (data.state) {// 赞或者灭成功
21
22                 if (is_up) {
23                     var val = $("#digg_count").text();
24                     val = parseInt(val) + 1;
25                     $("#digg_count").text(val);
26                 } else {
27                     var val = $("#bury_count").text();
28                     val = parseInt(val) + 1;
29                     $("#bury_count").text(val);
30                 }
31             }
32             else {    // 重复提交
33
34                 if (data.fisrt_action) {
35                     $("#digg_tips").html("您已经推荐过");
36                 } else {
37                     $("#digg_tips").html("您已经反对过");
38                 }
39
40                 setTimeout(function () {
41                     $("#digg_tips").html("")
42                 }, 1000)
43
44             }
45
46         }
47     })
48
49
50 })

  HTML文件:

 1 {% extends ‘base.html‘ %}
 2
 3 {% block page-main %}
 4
 5     <div class="article-detail">
 6         <h1>{{ article.title }}</h1>
 7         <p>{{ article.articledetail.content|safe }}</p>
 8     </div>
 9
10     <div id="div_digg">
11         <div class="diggit action">
12             <span class="diggnum" id="digg_count">{{ article.up_count }}</span>
13         </div>
14         <div class="buryit action">
15             <span class="burynum" id="bury_count">{{ article.down_count }}</span>
16         </div>
17         <div class="clear"></div>
18         <div class="diggword" id="digg_tips" style="color: red;"></div>
19     </div>

20     <!--通过标签的自定义属性来传递,让浏览器通过解析html代码拿到想要的值-->
21     <div class="info" article_id="{{ article.pk }}"></div>

22     {% csrf_token %}
23     <!--这样外部引入会导致内部的 模板语言的用法的地方无法拿到值,可以通过标签来传递-->
24     <script src="/static/js/article_detail.js"></script>

25
26 {% 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文件中的所有的{{ }}{% %}的部分进行相应的渲染替换成所传的值

  

  

原文地址:https://www.cnblogs.com/shijieli/p/10123191.html

时间: 2024-08-03 17:22:22

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

MyEclipse中的jsp文件中引入外部js文件时,乱码问题的解决

在myEclipse中右击js文件选择最下面的Properties选项,将Other修改为jsp文件的编码格式就可以了, 我的是UTF-8,只要修改完就没有问题了.

js如何判断引入的js文件是否加载完毕

js如何判断引入的js文件是否加载完毕:如果javascript代码较少的话完全可以将js代码通过<script></script>标签写在当前页面,但是如果js代码非常庞大的话,那么页面将会变得非常的臃肿,并且由于js代码是同步加载,所以当js代码加载的时候,会阻塞下面内容的解析,所以最好能够动态加载js功能,尤其是能够实现根据需要动态引入外部js文件.由于动态加载js文件是异步的,所以有时候需要判断js文件是否加载完毕,下面就通过代码介绍一下如何实现判断功能.代码如下: fun

Node.js 从零开发 web server博客项目

第1章 课程介绍 包括课程概述.核心模块.核心技术.课程安排.课程收获.讲授方式.学习前提等方面的介绍,让同学们对课程项目有一个直观的了解. 1-1 课程导读 试看第2章 nodejs 介绍 本章主要为了照顾尚未入门或者刚刚入门 nodejs 的同学,介绍 nodejs 的下载.安装和基本使用,以及 nodejs 和前端 javascript 的区别.另外,重点介绍了服务端开发和前端开发思路上的区别,为后续的开发做一个基础的铺垫. 2-1 下载和安装 2-2 nodejs和js的区别 2-3 c

Node.js Express博客项目实战 之 系统设置

系统设置在侧边栏的系统管理中: 在视图views的后台index.html中对应的系统设置写入跳转的路由: <li><a href="/admin/system" target="right"><span class="icon-caret-right"></span>系统设置</a></li> 在后台路由中进行注册该路由system.js // 系统管理 let syste

Node.js 从零开发 web server博客项目 前端晋升全栈工程师必备

第1章 课程介绍包括课程概述.核心模块.核心技术.课程安排.课程收获.讲授方式.学习前提等方面的介绍,让同学们对课程项目有一个直观的了解. 第2章 nodejs 介绍本章主要为了照顾尚未入门或者刚刚入门 nodejs 的同学,介绍 nodejs 的下载.安装和基本使用,以及 nodejs 和前端 javascript 的区别.另外,重点介绍了服务端开发和前端开发思路上的区别,为后续的开发做一个基础的铺垫. 第3章 项目介绍课程是通过案例的形式来学习 nodejs ,本章先来介绍这个案例,即个人博

一款基于vue.js 和node构建个人博客项目

前言 本项目是一款个人学习的博客项目,主要是为了学习vue2 和 node.js.另外涉及到MySQL redis nginx 等技术栈知识 项目地址 预览地址 (PC或者手机) > 注意:PC端支持markdown编辑博客,但是手机端不支持编辑,仅支持查看博客内容 博客预览地址:node后台版本 预览账号 账号:test 密码:123 技术栈 前端:html.css.sass.ES6.webpack.vue-cli.vue2.vuex.vue-router.axios.element-ui 后

vue项目引入第三方js插件,单个js文件引入成功,使用该插件方法时报错

1.引入第三方js文件,npm安装不了 2.控制台显示引入成功 3.在methods下使用 图片看不清请看下面代码 updateTime() { setInterval(()=>{ var cd = new Date(); var lunar = calendarNU.solar2lunar();//此处是引用插件方法 this.time = this.$options.methods.zeroPadding(cd.getHours(), 2) + ':' + this.$options.met

Django学习---多人博客项目(2)

Django学习---多人博客项目(2) ? 上一部分内容完成了博客项目的搭建,以及博客标题和博客内容的展示,熟悉了Django的使用,下面,接着实现用户管理部分功能. 一.自定义模板和静态文件的位置 (1)自定义模板的位置 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 当前文件路径的上两级文件路径--即是根目录 TEMPLATES = [ { 'BACKEND': 'django.templat

Django博客项目之首页

一.Django-admin 1.创建表和注册表 settings.py文件: TIME_ZONE = 'Asia/Shanghai'    #支持中文数据 models.py文件内容: from django.db import models from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser):     """     用户信息     ""&q