专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Go

Django分析之三级下拉菜单取舍省/市/县

发布时间:2011-06-29 18:27:56 文章来源:www.iduyao.cn 采编人员:星星草
Django分析之三级下拉菜单选择省/市/县

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

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

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

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….

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • ModernUI课程:定义一个Logo

    ModernUI教程:定义一个Logo ModernWindow的标题栏包含了一块区域用来显示自定义的窗体Logo: 这个窗体logo通过ModernWindow.LogoD...

  • Django忘记管理员账号和密码的解决方法

    Django忘记管理员账号和密码的解决办法 看着Django的教程学习搭建网站,结果忘记第一次创建的账号和密码了。结果搭建成功以后,一直...

  • GO语言小结(1)——基本知识

    GO语言总结(1)——基本知识 1、注释(与C++一样)   行注释://  块注释:/*   ...  */ 2、标识符   可以这么说,除了数字开头...

  • golang 惯用的文件读取方式

    golang 常用的文件读取方式 Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查。 一次性读取 小文件推荐一...

  • 查询深圳市通相关信息

    查询深圳通相关信息 用 HTTP.GET 从开放 API 中查询深圳通信息,然后将 JSON 数据存入结构体中,再格式化输出。 注意:获取的并不是实...

  • Go语言设计模式实践:结合(Composite)

    Go语言设计模式实践:组合(Composite) 关于本系列 这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就...

  • 列出索引和遍历目录

    列出目录和遍历目录 获取目录列表用 ioutil.ReadDir(),遍历目录用 filepath.Walk(),使用方法请参考文章示例。 示例代码: package ma...

  • io 包的惯用接口速记

    io 包的常用接口速记 我没有 C/C++ 基础,没有接口的概念,且从 Python 投奔而来,Python 的极简主义(一个结果往往只提供一个方法),让我在...

  • 代理服务扩充

    代理服务扩展 之前自己实现了一个代理服务,当时考虑的是只要支持SOCKS5就好了,因为我经常用CHROME,配合着SwitchySharp,体验还是很棒...

  • 文件的创造与打开

    文件的创建与打开 文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的。Golang 对文件的支持是在 os package ...

热门推荐: