Django-ajax之三级联动

在使用ajax,我们经常做一个案例:页面加载时,将全国的省份加载进来;若选择省份,则出现本省的所有地市;若选择地市,则出现本地市的所有区县。

今天我用Django和ajax来实现。

第一步:设计数据模型

为了减少表的数量,我设计了一张带有父id的表,为了简单,也有level(0位省份、2地市、3区县)

class Address_Province(models.Model):
    code = models.CharField(max_length=20, verbose_name="编码", primary_key=True)
    name = models.CharField(max_length=100, verbose_name="名称")
    parent_code = models.ForeignKey("self", blank=True, null=True, verbose_name="上级名称")
    level = models.IntegerField(verbose_name="级别,1省份 2地市 3区县")

    class Meta:
        db_table = "Address_Province"
        verbose_name = "中国省市县"
        verbose_name_plural = verbose_name
        ordering = [‘code‘]

    def __str__(self):
        return self.name

models

同时准备数据

第二步:Html代码

仅仅是搭建一个web结构

<div class="container">
    <div class="row">
        <label for="prov">省份</label>
        <select id="prov" name="prov">
            <option id="-1">请选择</option>
        </select>
        <br>
        <label for="city">地市</label>
        <select id="city" name="city">
            <option id="-1">请选择</option>
        </select>
        <br>
        <label for="country">区县</label>
        <select id="country" name="county">
            <option id="-1">请选择</option>
        </select>
    </div>
</div>

html

第三步:将省份信息在页面加载时就显示出下拉菜单

这里我们借助JQuery来实现,

$(function () {
    $("#country option:gt(0)").remove();
    /*初始化省份信息*/
    $.get("/junit/getProv/", function (data) {
        var result = JSON.parse(data);
        $.each(result, function (code, item) {
            liNode = $("<option></option>").attr("id", item.code).text(item.name);
            $("#prov").append(liNode);
        })
    });
}

我们从后端得到的json串是字符串,而不是Object对象。这时我们必须将字符串转成json对象,这里有两个方法:

1、JSON.parse(data)   原始的方法

2、$.parseJSON(data)   jquery方法

$.each是jquery的方法,目的是遍历集合result,针对集合中每个元素,执行回调方法。

$("<option></option>").attr("id", item.code).text(item.name);创建对象,同时给对象加上属性和文字

append将option标签加入到省份的select上。

那么前端的数据从哪里来的呢?当然是后台传过来的

第四步:创建取省份信息的视图函数

def getProv(request):
    # json.dumps(data)
    # TypeError: Object of type ‘QuerySet‘ is not JSON serializable
    data = Address_Province.objects.values("code", "name").filter(level=0).all()
    print(data)
    return HttpResponse(json.dumps(list(data)))

注意将对象转成字符串的方法:json.dumps应用到QuerySet对象时会报错,我只要转成list就正常。

至此,省份信息能在页面上正常显示。

第五步:点击省份显示地市

假如我点击某个省份,在地市下拉选中显示本省的所有地市。那对省份下拉选触发了点击事件,增加$("#prov").click(fn)合适吗?假如我连续选择相同的省份,实际上没有必要触发事件。这样我们使用change事件更加合适些。$("#prov").change

我怎么把省份id信息传递到后台呢??我们需要得到变更后的id

var prov_code = $(this).find("option:selected").attr("id");

使用$.get来执行ajax函数,同时传送所选省份参数

$("#prov").change(function () {
    var prov_code = $(this).find("option:selected").attr("id");
    $.get("/junit/getCity/", {prov_selected: prov_code}, function (data) {
        var result = parse(data);
        $.each(result, function (code, item) {
            var liNode = $("<option></option>").attr("id", item.code).text(item.name);
            $("#city").append(liNode);
        })
    });
});

第六步:依据省份得到地市信息

def getCity(request):
    prov_selected = request.GET.get("prov_selected")
    data = Address_Province.objects.values("code", "name").filter(level=2, parent_code=prov_selected).all()
    return HttpResponse(json.dumps(list(data)))

这里查询数据使用Django自带的orm工具。

对于点击地市得到区县,采用同样的处理方法

第七步:及时清理原来的下拉选内容

我们点击山东,再次点击河北,会发现地市下拉选同时包括两个省份的地市信息,这就不对啦。我们在展示地市信息时,需要先清理原来的地市。

$("#prov").change(function () {
    var prov_code = $(this).find("option:selected").attr("id");
    $("#city option:gt(0)").remove();
    $("#country option:gt(0)").remove();
    $.get("/junit/getCity/", {prov_selected: prov_code}, function (data) {
        var result = parse(data);
        $.each(result, function (code, item) {
            var liNode = $("<option></option>").attr("id", item.code).text(item.name);
            $("#city").append(liNode);
        })
    });
});

以上我使用$.get来实现,下一步我们使用$.post来实现,会有意想不到的错误。未完待续……

时间: 2024-10-12 00:40:04

Django-ajax之三级联动的相关文章

PHP ajax 实现三级联动

在一个单独JS页面中,利用ajax实现三级联动,做成一个三级联动形式,以便于以后随时调用 JS代码: 1 $(document).ready(function(e) { 2 $("#sanji").html("<select id='sheng'></select><select id='shi'></select><select id='qu'></select>"); 3 4 //填充内容

AJAX省市区三级联动下拉列表实现 JAVA开发

转载自:http://blog.sina.com.cn/s/blog_a48af8c001011lx1.html 例子--District Picker            http://fengyuanchen.github.io/distpicker/ 此小程序的功能主要是采用异步请求方式从数据库中调取省市区信息显示到下拉列表: 代码如下: 建立数据库中的代码和一些配置文件信息就省略了,主要有JavaScript中的代码为: $(document).ready(function(){   

完整的Ajax及三级联动小练习

Ajax结构: var name = $("#text_1").val(); $.ajax({ url: "Ashxs/Handler.ashx",//一般处理程序路径 data: { "name": name },//要传输的数据,冒号前面是键名后面是要传输的数据,如果有多条数据在大括号内用逗号拼接 type: "post",//传输方式 dataType: "json",//返回数据类型 success

Jquery Ajax + php 三级联动实例

sanji.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=&quo

ajax省市区三级联动

jdbc+servlet+ajax开发省市区三级联动 技术点:jdbc操作数据库,ajax提交,字符拦截器,三级联动 特点:局部刷新达到省市区三级联动,举一反三可以做商品分类等 宗旨:从实战中学习 博客讲解是按照两级联动,但下载的资源是三级联动含sql文件. 效果图: 首页核心代码: [html] view plain copy <% List<HashMap<String,Object>> maps = ConnectionUtil.findProvinces(); pag

用ajax实现三级联动

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="

AJAX实现三级联动

省市区三级联动插件: 主页面:为方便使用,不用写过多代码,只写一个id为sanji的div,若别的页面要用,只需写一个id为sanji的div,加载上jQuery与sanji.js文件即可 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xml

ajax实现三级联动下拉菜单

先不要着急去实现功能,我们第一步首先要理清思路,想要实现三级联动,首先要有三个下拉框,然后点击第一个下拉菜单,可以联动到第二个,点击第二个联动到第三个,实现省市区的三级联动,用到的数据表如下: 为了以后可以随时拿出来用,我们先在主页面建立一个div叫sanji,然后用一个js页面来引用: 主页面引入Jquery和js: <title>无标题文档</title> <script src="jquery-3.2.0.min.js"></script

ajax地址三级联动下拉表

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <

Ajax商品分类三级联动实现

思路分析: 效果:当页面加载时,利用ajax异步向后台请求数据,加载一级商品类别,当选择一级商品时加载二级商品,选择二级商品加载三级商品. 实现: 1.当拿到数据后加载pid为0的商品,并动态创建option将商品追加到一级菜单中,并设置value值 2.当选择一级商品时加载pid=当前id的商品,并创建option将商品追加到二级菜单中,并设置value值 3.当选择二级商品时加载pid=当前id的商品,并创建option将商品追加到三级菜单中,并设置value值 页面效果: 1 $(func