Django Web实现动态三级联动

简介:

1.平台环境

    操作系统:Windows 7 64位

    开发环境:Eclipse PyDev




2.文件夹结构

    直接看下面的图片:

wKioL1ZULlvhko5KAAAz8NPmbRw173.png

    目前很多文件还用不上,在创建Django的项目时或app时,很多文件都是自动生成的,下面会说一说可以用得上的文件。




3.主要功能文件与代码


(1)MapPro/settings.py

    目前主要是用来设置statics和templates,告诉Django这两个目录的存在路径,添加的代码如下:

1
2
3
4
5
6
7
TEMPLATE_DIRS  =  (
                  os.path.join(BASE_DIR, 'templates' ),
                  )
 
STATICFILES_DIRS  =  (
                     os.path.join(BASE_DIR, 'statics' ),
                     )


(2)MapPro/urls.py

    设置url路径和views视图函数的映射关系,全部代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from  django.conf.urls  import  patterns, include, url
from  django.contrib  import  admin
from  app01  import  views
 
urlpatterns  =  patterns('',
     # Examples:
     # url(r'^$', 'MapPro.views.home', name='home'),
     # url(r'^blog/', include('blog.urls')),
 
     url(r '^admin/' , include(admin.site.urls)),
     url(r '^map/$' ,views. Map ),
     (r '^GetCityData/$' ,views.Return_City_Data),
     (r '^GetCountryData/$' ,views.Return_Country_Data),
)


(3)app01/views.py

    视图函数文件,用来处理业务逻辑,全部代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from  django.shortcuts  import  render,render_to_response
from  django.http  import  HttpResponse
from  django.core.context_processors  import  request
import  json
 
# Create your views here.
 
def  Map (request):
     return  render_to_response( "map.html" )
     #return HttpResponse("Hello!")
     
Place_dict  =  {
         "GuangDong" :{
                         "GuangZhou" :[ "PanYu" , "HuangPu" , "TianHe" ],
                         "QingYuan" :[ "QingCheng" , "YingDe" , "LianShan" ],
                         "FoShan" :[ "NanHai" , "ShunDe" , "SanShui" ]
                         },
         "ShanDong" :{
                         "JiNan" :[ "LiXia" , "ShiZhong" , "TianQiao" ],
                         "QingDao" :[ "ShiNan" , "HuangDao" , "JiaoZhou" ]
                         },
         "HuNan" :{
                         "ChangSha" :[ "KaiFu" , "YuHua" , "WangCheng" ],
                         "ChenZhou" :[ "BeiHu" , "SuXian" , "YongXian" ]
                     }
     };
def  Return_City_Data(request):
     province  =  request.GET[ 'Province' ]
     print  province
     City_list  =  []
     for  city  in  Place_dict[province]:
         City_list.append(city)
     return  HttpResponse(json.dumps(City_list))    
     
def  Return_Country_Data(request):
     province,city  =  request.GET[ 'Province' ],request.GET[ 'City' ]
     print  province,city
     Country_list  =  Place_dict[province][city]
     return  HttpResponse(json.dumps(Country_list))

    这里的代码比较简单,就不写注释了。


(4)templates/map.html

    templates目录主要用来放置页面的模板文件,这里我只创建map.html文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<!DOCTYPE html>
< html >
< head  lang = "en" >
     < meta  charset = "UTF-8" >
     < title >三级联动测试</ title >
     < script  src = "/static/jquery-1.8.2.js" ></ script >
     < script  type = "text/javascript" >
         //用来获得option元素中selected属性为true的元素的id
         function Get_Selected_Id(place){
             var pro = document.getElementById(place);
             var Selected_Id = pro.options[pro.selectedIndex].id;
//            console.log("Get_Selected_Id:"+Selected_Id);  //测试使用
             return Selected_Id;         //返回selected属性为true的元素的id
         }
 
         //执行相应的动作,调用相关数据请求函数
         function Get_Next_Place(This_Place_ID,Action){
             var Selected_Id = Get_Selected_Id(This_Place_ID);   //Selected_Id用来记录当前被选中的省或市的ID
             if(Action=='Get_city')                            //从而可以在下一个级联中加载相应的市或县
                 Get_City_Data(Selected_Id);
             else if(Action=='Get_country')
                 Get_Country_Data(Selected_Id);
         }
 
         //向服务器请求城市列表数据并调用添加城市函数
         function Get_City_Data(Province_Selected_Id){    //这里的Selected_Id应该是被选中的省份的ID
//            console.log("Province_Selected_Id:"+Province_Selected_Id);   //测试使用
             if(Province_Selected_Id == 'Not_data1'){    //如果选择了"Province"选项,则表示重置当前City和Country的选项内容,不会向服务器请求数据
                 $("#city").empty();
                 $("#city").append("< option  id = 'Not_data2' >City</ option >");
                 $("#country").empty();
                 $("#country").append("< option  id = 'Not_data3' >Country</ option >");
             }else{      //否则就会向服务器请求数据
                 $.getJSON('/GetCityData/',{'Province':Province_Selected_Id},function(City_list){
//                    console.log(City_list);      //测试使用
                     Add_city(City_list);    //调用添加城市选项函数
                 });
             }
         }
 
         //在当前页面添加城市选项
         function Add_city(City_list){
             $("#city").empty();
             $("#city").append("< option  id = 'Not_data2' >City</ option >");
             $("#country").empty();
             $("#country").append("< option  id = 'Not_data3' >Country</ option >");
             //上面的两次清空与两次添加是为了保持级联的一致性
             for(var index in City_list){     //获得城市列表中的城市索引
                 //添加内容的同时在option标签中添加对应的城市ID
                 var text = "< option "+"  id = '"+City_list[index]+"' >"+City_list[index]+"</ option >";
                 $("#city").append(text);
                 console.log(text);  //用来观察生成的text数据
             }
         }
 
         //向服务器请求县区列表数据并调用添加县区函数
        function Get_Country_Data(City_Selected_Id){
//           console.log("City_Selected_Id:"+City_Selected_Id);   //测试使用
            if(City_Selected_Id == 'Not_data2'){     //如果选择了City选项,则表示重置当前Country的选项内容,不会向服务器请求数据
                $("#country").empty();
                $("#country").append("< option  id = 'Not_data3' >Country</ option >");
                //上面的清空与添加是为了保持级联的一致性
            }else{   //否则就会向服务器请求数据
                var Province_Selected_ID = Get_Selected_Id("province");  //获得被选中省的ID,从而方便从服务器中加载数据
                $.getJSON('/GetCountryData/',{'Province':Province_Selected_ID,'City':City_Selected_Id},function(Country_list){
//                   console.log(Country_list);    //测试使用
                    Add_country(Country_list);   //调用添加县区选项函数
                });
            }
         }
 
         //在当前页面添加县区选项
         function Add_country(Country_list){
             $("#country").empty();
             $("#country").append("< option  id = 'Not_data3' >Country</ option >");
             //上面的清空与添加是为了保持级联的一致性
             for(var index in Country_list){     //获得县区列表中的县区索引
                 //添加内容的同时在option标签中添加对应的城市ID
                 var text = "< option "+"  id = '"+Country_list[index]+"' >"+Country_list[index]+"</ option >";
                 $("#country").append(text);
                 console.log(text);  //用来观察生成的text数据
             }
         }
 
     </ script >
</ head >
< body >
     < p >您的收货地址:</ p >
     < select  id = "province"  onchange = "Get_Next_Place('province','Get_city')" >
         < option  id = "Not_data1" >Province</ option >
         < option  id = "GuangDong"  value = "GuangDong" >GuangDong</ option >
         < option  id = "ShanDong"  value = "ShanDong" >ShanDong</ option >
         < option  id = "HuNan"  value = "HuNan" >HuNan</ option >
     </ select >
     < select  id = "city"  onchange = "Get_Next_Place('city','Get_country')" >
         < option  id = "Not_data2" >City</ option >
     </ select >
     < select  id = "country" >
         < option  id = "Not_data3" >Country</ option >
     </ select >
     < br />
</ body >
</ html >

    这里的代码相对前面的就有点多,主要是因为在省市县的级联关系、数据的请求与添加上,需要进行相关的逻辑判断,当然,仔细分析,这里的很多代码都可以合并,时间关系,就不进行重构了。




4.测试与实现

    最终的结果是跟前面写的那篇文章一样的,只是不同的是,这里的数据都是来自Web服务器的,用户的每一次点击都会触发一个事件,从而向服务器请求数据。

    就不多说了,有兴趣的朋友可以试一试!

相关文章
|
7天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
关系型数据库 MySQL 定位技术
Python web框架 之Django + Python3.7 + 集成百度地图【视频讲解】
python集成百度地图 介绍 python集成百度地图demo
439 0
Python web框架 之Django + Python3.7 + 集成百度地图【视频讲解】
|
3月前
|
前端开发 数据库 Python
使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
【1月更文挑战第13天】使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
78 7
|
4月前
|
算法 关系型数据库 API
Python【算法中心 02】Web框架Django管理页面使用(管理员账号创建+API使用+应用添加)GreenPlum数据库引擎及API测试
Python【算法中心 02】Web框架Django管理页面使用(管理员账号创建+API使用+应用添加)GreenPlum数据库引擎及API测试
42 0
|
4月前
|
算法 Java Python
Python【算法中心 01】Web框架Django入门(安装+项目创建+应用创建+服务启动)Python搭建算法中心后台实例分享
Python【算法中心 01】Web框架Django入门(安装+项目创建+应用创建+服务启动)Python搭建算法中心后台实例分享
46 0
|
5月前
|
缓存 定位技术 数据库
初识python web框架-- Django
初识python web框架-- Django
|
7月前
|
API Python
Python Web框架:Django、Flask和FastAPI巅峰对决
Python Web框架:Django、Flask和FastAPI巅峰对决
767 0
|
数据采集 机器学习/深度学习 人工智能
分分钟教你Python Web开发框架Django
Python除了爬虫、深度学习(人工智能)、数据分析等外,还可以用来开发网站系统,如我们常见的**知乎,豆瓣**等都是用Python开发的网站系统。 今天辰哥就来教大家如何新建属于自己的Django项目,让Django学习不再迷茫,本文会以**图文的形式**,一步一步的讲解,让大家看完本文后对Django不再陌生。
169 0
分分钟教你Python Web开发框架Django
|
关系型数据库 MySQL 数据库
python的Web框架,Django模型系统二,模型属性,及数据库进阶查询
python的Web框架,Django模型系统二,模型属性,及数据库进阶查询 原始数据接上篇文章来操作。可能需要查看后才能懂。点击这里查看 1.常用的模型字段类型 官方文档:https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types 定义的模型中,类名对应的表名,类属性对应的表的字段,我们在上节内容有说过,可以查看。
1541 0
|
Web App开发 关系型数据库 MySQL
Python的Web应用框架--Django
一:简介      python的web框架有很多,个人查了一下,有Django、Pylons、 Tornado、Bottle和Flask等,其中使用人数最多的是Django,而我学习Django也是因为openstack中使用的是django框架。
1435 0