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通过select实现异步IO的方法
Jun 04 Python
Python简单实现控制电脑的方法
Jan 22 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
Apr 27 Python
python3爬虫之设计签名小程序
Jun 19 Python
python对文件目录的操作方法实例总结
Jun 24 Python
python自动化测试之如何解析excel文件
Jun 27 Python
Python图片的横坐标汉字实例
Dec 04 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
使用 Python 遍历目录树的方法
Feb 29 Python
Python库安装速度过慢解决方案
Jul 14 Python
Pandas 数据编码的十种方法
Apr 20 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
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
PHP面向对象的使用教程 简单数据库连接
2006/11/25 PHP
PHP 翻页 实例代码
2009/08/07 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
php smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
destoon整合UCenter图文教程
2014/06/21 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
php基于openssl的rsa加密解密示例
2016/07/11 PHP
js FLASH幻灯片字符串中有连接符&的处理方法
2012/03/01 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
2016/04/03 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
JS中利用swiper实现3d翻转幻灯片实例代码
2017/08/25 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
简单分析Python中用fork()函数生成的子进程
2015/05/04 Python
python修改操作系统时间的方法
2015/05/18 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
京东全球售:直邮香港,澳门,台湾,美国,澳大利亚等地区
2017/09/24 全球购物
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
客房主管岗位职责
2013/12/09 职场文书
学习决心书范文
2014/03/11 职场文书
私营公司诉讼代理委托书范本
2014/09/13 职场文书
三人合伙协议书范本
2014/10/29 职场文书
合理化建议书
2015/02/04 职场文书
检察院起诉意见书
2015/05/20 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
Window server中安装Redis的超详细教程
2021/11/17 Redis