Django与JS交互的示例代码


Posted in Python onAugust 23, 2017

应用一:有时候我们想把一个 list 或者 dict 传递给 javascript,处理后显示到网页上,比如要用 js 进行可视化的数据。
请注意:如果是不处理,直接显示在网页上,用Django模板就可以了。

这里讲述两种方法:

一,页面加载完成后,在页面上操作,在页面上通过 ajax 方法得到新的数据(再向服务器发送一次请求)并显示在网页上,这种情况适用于页面不刷新的情况下,动态加载一些内容。比如用户输入一个值或者点击某个地方,动态地把相应内容显示在网页上。

二,直接在视图函数(views.py中的函数)中渲染一个 list 或 dict 的内容,和网页其它部分一起显示到网页上(一次性地渲染,还是同一次请求)。

需要注意两点:1、views.py中返回的函数中的值要用 json.dumps()处理   2、在网页上要加一个 safe 过滤器

view.py

# -*- coding: utf-8 -*- 
 
from __future__ import unicode_literals 
 
import json 
from django.shortcuts import render 
 
def home(request): 
 List = ['自强学堂', '渲染Json到模板'] 
 Dict = {'site': '自强学堂', 'author': '涂伟忠'} 
 return render(request, 'home.html', { 
   'List': json.dumps(List), 
   'Dict': json.dumps(Dict) 
  })

home.html

<!DOCTYPE html> 
<html> 
<head> 
<title>欢迎光临 自强学堂!</title> 
<script src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script> 
</head> 
<body> 
<div id="list"> 学习 </div> 
<div id='dict'></div> 
<script type="text/javascript"> 
 //列表 
 var List = {{ List|safe }}; 
 
 //下面的代码把List的每一部分放到头部和尾部 
 $('#list').prepend(List[0]); 
 $('#list').append(List[1]); 
 
 console.log('--- 遍历 List 方法 1 ---') 
 for(i in List){ 
  console.log(i);// i为索引 
 } 
 
 console.log('--- 遍历 List 方法 2 ---') 
 for (var i = List.length - 1; i >= 0; i--) { 
  // 鼠标右键,审核元素,选择 console 可以看到输入的值。 
  console.log(List[i]); 
 }; 
 
 console.log('--- 同时遍历索引和内容,使用 jQuery.each() 方法 ---') 
 $.each(List, function(index, item){ 
  console.log(index); 
  console.log(item); 
 }); 
 
 
 // 字典 
 var Dict = {{ Dict|safe }}; 
 console.log("--- 两种字典的取值方式 ---") 
 console.log(Dict['site']); 
 console.log(Dict.author); 
  
 console.log("--- 遍历字典 ---"); 
 for(i in Dict) { 
  console.log(i + Dict[i]);//注意,此处 i 为键值 
 } 
</script> 
</body> 
</html>

应用二:不刷新网页的情况下,加载一些内容

view.py

#coding:utf-8 
from __future__ import unicode_literals 
from django.shortcuts import render 
from django.http import HttpResponse 
 
def get(request): 
 return render(request, 'oneapp/get.html') 
 
def add(request): 
 a = request.GET.get('a', 0) 
 b = request.GET.get('b', 0) 
 c = int(a) + int(b) 
 return HttpResponse(str(c))

urls.py

from django.conf.urls import url, include 
from django.contrib import admin 
from OneApp import views as oneapp_views 
 
urlpatterns = [ 
 url(r'^admin/', admin.site.urls), 
 #url(r'^$', oneapp_views.index), 
 url(r'^oneapp/index/', oneapp_views.index, name='index'), 
 url(r'^oneapp/home/', oneapp_views.home, name='home'), 
 url(r'^oneapp/get/', oneapp_views.get, name='get'), 
 url(r'^oneapp/add/', oneapp_views.add, name='add'), 
]

get.html

<!DOCTYPE html> 
<html> 
<body> 
<p>请输入两个数字</p> 
<form action="/oneapp/add/" method="get"> 
 a: <input type="text" id="a" name="a"> <br> 
 b: <input type="text" id="b" name="b"> <br> 
 <p>result: <span id='result'></span></p> 
 <button type="button" id='sum'>提交</button> 
</form> 
 
<script src="http://apps.bdimg.com/libs/jquery/1.11.1/jquery.min.js"></script> 
<script> 
 $(document).ready(function(){ 
  $("#sum").click(function(){ 
  var a = $("#a").val(); 
  var b = $("#b").val(); 
 
  $.get("/oneapp/add/",{'a':a,'b':b}, function(ret){ 
   $('#result').html(ret) 
  }) 
  }); 
 }); 
</script> 
</body> 
</html>

由于用 jQuery 实现 ajax 比较简单,所以我们用 jQuery库来实现.。

用了jQuery.get() 方法,并用 $(selector).html() 方法将结果显示在页面上,如下图:

Django与JS交互的示例代码

应用三:传递数字或者字典到网页,由JS处理,再显示出来

首先定义接口和URL

views.py

#coding:utf-8 
from __future__ import unicode_literals 
from django.shortcuts import render 
from django.http import HttpResponse, JsonResponse 
import json 
 
 
# Create your views here. 
 
 
def ajax_list(request): 
 a = range(100) 
 #return HttpResponse(json.dump(a), content_type='application/json') 
 return JsonResponse(a, safe=False) 
 
def ajax_dict(request): 
 name_dict = {'a': 1, 'b': 2} 
 #return HttpResponse(json.dump(name_dict), content_type='application/json') 
 return JsonResponse(name_dict)

urls.py

urlpatterns = [ 
 url(r'^admin/', admin.site.urls), 
 #url(r'^$', oneapp_views.index), 
 url(r'^oneapp/index/', oneapp_views.index, name='index'), 
 url(r'^oneapp/home/', oneapp_views.home, name='home'), 
 url(r'^oneapp/get/', oneapp_views.get, name='get'), 
 url(r'^oneapp/add/', oneapp_views.add, name='add'), 
 url(r'^oneapp/ajax_list/', oneapp_views.ajax_list, name='ajax_list'), 
 url(r'^oneapp/ajax_dict/', oneapp_views.ajax_dict, name='ajax_dict'), 
]

然后就是在无刷新的情况下,把内容加载到页面了。

index.html

<!DOCTYPE html> 
<html> 
<body> 
<p>请输入两个数字</p> 
<form action="/add/" method="get"> 
 a: <input type="text" id="a" name="a"> <br> 
 b: <input type="text" id="b" name="b"> <br> 
 <p>result: <span id='result'></span></p> 
 <button type="button" id='sum'>提交</button> 
</form> 
 
 
<div id="dict">Ajax 加载字典</div> 
<p id="dict_result"></p> 
 
<div id="list">Ajax 加载列表</div> 
<p id="list_result"></p> 
 
 
<script src="http://apps.bdimg.com/libs/jquery/1.11.1/jquery.min.js"></script> 
<script> 
 $(document).ready(function(){ 
  // 求和 a + b 
  $("#sum").click(function(){ 
  var a = $("#a").val(); 
  var b = $("#b").val(); 
 
  $.get("{% url 'add' %}",{'a':a,'b':b}, function(ret){ 
   $('#result').html(ret); 
  }) 
  }); 
 
  // 列表 list 
  $('#list').click(function(){ 
   $.getJSON("{% url 'ajax_list' %}",function(ret){ 
   //返回值 ret 在这里是一个列表 
   for (var i = ret.length - 1; i >= 0; i--) { 
    // 把 ret 的每一项显示在网页上 
    $('#list_result').append(' ' + ret[i]) 
   }; 
   }) 
  }) 
 
  // 字典 dict 
  $('#dict').click(function(){ 
   $.getJSON("{% url 'ajax_dict' %}",function(ret){ 
    //返回值 ret 在这里是一个字典 
    $('#dict_result').append(ret.a + '<br>'); 
    // 也可以用 ret['twz'] 
   }) 
  }) 
 }); 
</script> 
</body> 
</html>

注意:getJSON中的写的对应网址,用 urls.py 中的 name 来获取是一个更好的方法!标签:{% url 'name' %}

这样做最大的好处就是在修改 urls.py 中的网址后,不用改模板中对应的网址。

如果是一个复杂的字典或者列表,如:

person_info_dict = [ 
 {"name":"xiaoming", "age":20}, 
 {"name":"tuweizhong", "age":24}, 
 {"name":"xiaoli", "age":33}, 
]

这样我们遍历列表的时候,每次遍历得到一个字典,再用字典的方法去处理,当然有更简单的遍历方法:

用 $.each() 方法代替 for 循环,html 代码(jquery)

$.getJSON('ajax_url_to_json', function(ret) { 
 $.each(ret, function(i,item){ 
  // i 为索引,item为遍历值 
 }); 
});

补充:如果 ret 是一个字典,$.each 的参数有所不同,详见:http://api.jquery.com/jquery.each/

$.getJSON('ajax-get-a-dict', function(ret) { 
 $.each(ret, function(key, value){ 
  // key 为字典的 key,value 为对应的值 
 }); 
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中执行shell命令的几个方法小结
Sep 18 Python
详解python单例模式与metaclass
Jan 15 Python
浅谈Python peewee 使用经验
Oct 20 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
5分钟 Pipenv 上手指南
Dec 20 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
Python使用selenium + headless chrome获取网页内容的方法示例
Oct 16 Python
Python搭建代理IP池实现获取IP的方法
Oct 27 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
浅谈在JupyterNotebook下导入自己的模块的问题
Apr 16 Python
python编写一个会算账的脚本的示例代码
Jun 02 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
Nov 28 Python
python paramiko模块学习分享
Aug 23 #Python
定制FileField中的上传文件名称实例
Aug 23 #Python
基于python元祖与字典与集合的粗浅认识
Aug 23 #Python
Python 多线程Threading初学教程
Aug 22 #Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 #Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 #Python
Python实现的矩阵类实例
Aug 22 #Python
You might like
网站当前的在线人数
2006/10/09 PHP
PHP排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
php实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
python去掉空白行的多种实现代码
2018/03/19 Python
pycharm设置注释颜色的方法
2018/05/23 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
Pytorch转onnx、torchscript方式
2020/05/25 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
高中微机老师自我鉴定
2014/02/16 职场文书
人力资源主管职责范本
2014/03/05 职场文书
降消项目实施方案
2014/03/30 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
房产协议书范本2014
2014/09/30 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
创业计划书之干洗店
2019/09/10 职场文书
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android