今天遇到了一个一直想做却没有机会去做的功能,今天完成了便记录下来。

那这次是具体是个什么功能呢?其实还是很简单的效果,就是在用户注册的时候可以选择省/市/县,很简单的一个小功能。

那现在就开始了~首先我们要在数据库中先建一个表,用来保存全国的省/市/县信息,下面是表的结构:

CREATE TABLE  IF NOT EXISTS "china_regionalTable" (
"id" integer NOT NULL,
"name" varchar(50) DEFAULT NULL,
"level" integer DEFAULT NULL,
"parent" integer DEFAULT NULL,
PRIMARY KEY ("id")
) ;

剩下的就是按照这个格式去插入数据咯

insert  into "china_regionalTablet"("id","name","level","parent") values (110000,'北京市',1,0),(110100,'市辖区',2,110000).......

现在数据库里有数据了,因为我用的是Python的SQLAlchemyORM框架,所以下面就要写model类来与数据库中的表进行映射了

class ChinaRegionalTable(dash_models.Base):
__tablename__ = 'china_regionalTable' id = Column(SmallInteger,nullable=False,primary_key=True)
name = Column(String(200))
level = Column(SmallInteger,nullable=False)
parent = Column(SmallInteger,nullable=False)

那么现在就是在view层来处理来自前端的请求了

#注册页面选择区县
def get_city(request):
parent = int(request.POST['parent'])
level = request.POST['level']
s = request.get_session()
citys = s.query(ChinaRegionalTable).filter_by(parent=parent,level=level).all()
dict_city = []
for city in citys:
temp = []
temp.append(city.id)
temp.append(city.name)
dict_city.append(temp)
return HttpResponse(json.dumps({"dict_city":dict_city}))

这其中是通过get_session()来取得与数据库的连接的,下面就是一个URL的路由表了

url(r'^ajax/get_city/$' ,'get_city'),

接下来就是前端页面的代码了,首先是部分静态的HTML代码:

<div class="input-group" style="margin-bottom: 10px;margin-left: 70px;">
<span class="input-group-addon" style="padding: 5px 10px"><i class="glyphicon glyphicon-info-sign"></i></span>
<select id="shengcode" >
<option selected value="">请选择省份</option>
</select>
<select id="shicode" >
<option selected value="">请选择</option>
</select>
<select id="xiancode" >
<option selected value="">请选择</option>
</select>
</div>

因为使用的是jQuery,所以采用的是当页面第一次加载完成的时候就发送一个ajax请求到后台取得第一级的内容,然后绑定事件,当我选择第一级下拉菜单中的内容的时候我便会去后台查找,然后返回第二级菜单的内容,从而以此类推,直到结束。

$(function(){
$.ajax({
type:'POST',
url:'/app/ajax/get_city/',
data:{"parent":0,"level":1},
success:function(data){
var all_ps=data['dict_city']
<!--这里取得结果后,然后遍历出结果填充在对应的html页面中-->
for(var i=0;i<all_ps.length;i++){
var $html=String.format('<option value="{0}">{1}</option>',all_ps[i][0],all_ps[i][1])
$('#shengcode').append($html)
}
},
error: function (jqXHR, textStatus, errorThrown) {
console.log("error");
},
dataType: 'json'
});
        $('#shengcode').change(function(){
var parent = $('#shengcode').val()
$.ajax({
type:'POST',
url:'/app/ajax/get_city/',
data:{"parent":parent,"level":2},
success:function(data){
var all_ps=data['dict_city']
<!--在填充之前将后面的几个下拉菜单制空-->
var $shicode = $('#shicode').empty();
$shicode.append('<option selected value="">请选择</option>')
var $xiancode = $('#xiancode').empty();
$xiancode.append('<option selected value="">请选择</option>')
for(var i=0;i<all_ps.length;i++){
var $html=String.format('<option value="{0}">{1}</option>',all_ps[i][0],all_ps[i][1])
$('#shicode').append($html)
}
},
error: function (jqXHR, textStatus, errorThrown) {
console.log("error");
},
dataType: 'json'
});
}) $('#shicode').change(function(){
var parent = $('#shicode').val()
$.ajax({
type:'POST',
url:'/app/ajax/get_city/',
data:{"parent":parent,"level":3},
success:function(data){
var all_ps=data['dict_city']
var $xiancode = $('#xiancode').empty();
$xiancode.append('<option selected value="">请选择</option>')
for(var i=0;i<all_ps.length;i++){
var $html=String.format('<option value="{0}">{1}</option>',all_ps[i][0],all_ps[i][1])
$('#xiancode').append($html)
}
},
error: function (jqXHR, textStatus, errorThrown) {
console.log("error");
},
dataType: 'json'
});
})
})

到此为止,这个简单的小功能就算彻底实现了,但是还是有个小小的不爽,就是虽然三次请求都是使用的一个url地址,而且也都使用的是一个view函数来处理的,但是前端的js代码却要写三次,感觉有些累赘,如果能有更好的意见感谢各位大神告知小弟Orz….

Django分析之三级下拉菜单选择省/市/县的更多相关文章

  1. excel选择元角分下拉菜单选择框自动变更数字

    excel选择元角分下拉菜单选择框自动变更数字 (M2列),数据-->数据有效性-->在“允许”栏中选择序列-->在“来源”栏中输入:分,角,元单位倍数公式(M4列):=IF(M2= ...

  2. Atitit.ui控件---下拉菜单选择控件的实现select html

    Atitit.ui控件---下拉菜单选择控件的实现select   html 1. 调用& model的实现 1 2. -----select.jsp------ 1 1. 调用& m ...

  3. jQuery 当前展开其他收缩 三级下拉菜单(转载)

    jQuery可展开收缩三级下拉菜单 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  4. [jquery]添加行内容后根据下拉菜单选择内容对比之前已有选项,若有重置再提示

    今天页面上一个添加列内容时,要对选择内容与之前已有选项内容作对比,防止用户重复选择内容 页面HTML代码 <ul class="list-group xj-list-NObor xj- ...

  5. CSS打造三级下拉菜单

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  6. 下拉菜单选择(jQuery实现)

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  7. Axure-----三级下拉菜单的具体实现过程

    ********三级下拉菜单的动画效果:********** 1.选中三级菜单将其转换为动态面板,命名为treePanel,并隐藏. 2.选中二级菜单添加交互效果:[切换可见性],勾选treePane ...

  8. jQuery 前端复选框 全选 反选 下拉菜单联动

    jQuery 页面中复选框全选.反选.下拉联动(级联) <!DOCTYPE html> <html lang="en"> <head> < ...

  9. (实用篇)jQuery+PHP+MySQL实现二级联动下拉菜单

    二级联动下拉菜单选择应用在在很多地方,比如说省市下拉联动,商品大小类下拉选择联动.本文将通过实例讲解使用jQuery+PHP+MySQL来实现大小分类二级下拉联动效果. 先看下效果 大类:  前端技术 ...

随机推荐

  1. IK分词器 整合solr4.7 含同义词、切分词、停止词

    转载请注明出处! IK分词器如果配置成 <fieldType name="text_ik" class="solr.TextField"> < ...

  2. Hadoop里的数据挖掘应用-Mahout——学习笔记<三>

    之前有幸在MOOC学院抽中小象学院hadoop体验课. 这是小象学院hadoop2.X的笔记 由于平时对数据挖掘做的比较多,所以优先看Mahout方向视频. Mahout有很好的扩展性与容错性(基于H ...

  3. HTML5 data-* 属性

    HTML5 data-* 属性 jQuery Mobile 依赖 HTML5 data-* 属性来支持各种 UI 元素.过渡和页面结构.不支持它们的浏览器将以静默方式弃用它们.表 2 显示如何使用 d ...

  4. php之jquery

    <!DOCTYPE html> <html> <head> <script type="xxx.js"></script> ...

  5. js函数中this的不同含义

    1.js函数调用过程中,js线程会进入新的执行环境并创建该环境的变量对象,并添加两个变量:this和arguments,因此可以在函数中使用这两个变量.需要注意的是,this变量不能重新赋值,而arg ...

  6. 为什么operator>>(istream&, string&)能够安全地读入长度未知的字符串?

    一般而言,实现"读入用户输入的字符串",程序中自然不能对用户输入的长度有所限定.这在C++中很容易实现,而在C中确没那么容易. 这一疑问,我在刚学C++的时候也在脑中闪现过:不过很 ...

  7. js指定分隔符连接数组元素join()

    指定分隔符连接数组元素join() join()方法用于把数组中的所有元素放入一个字符串.元素是通过指定的分隔符进行分隔的. 语法: arrayObject.join(分隔符) 参数说明: 注意:返回 ...

  8. 【python】继承关系和isinstance

    来源:廖雪峰 继承关系是: object -> Animal -> Dog -> Husky 那么,isinstance()就可以告诉我们,一个对象是否是某种类型.先创建3种类型的对 ...

  9. NEFU 558 迷宫寻路

    题目链接 简单搜索题 #include <cstdio> #include <iostream> #include <cstring> using namespac ...

  10. 使用emIDE创建STM32项目

    emIDE是一个开源的嵌入式集成开发环境,基于Code::Blocks开发,能够支持多个平台和多个厂家的嵌入式硬件,继承了Code::Blocks的有点. 下载emIDE并安装,也可选择绿色版.若需要 ...