django三级联动

发布于:2025-05-27 ⋅ 阅读:(27) ⋅ 点赞:(0)

HTML:
 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 1. 导入CSS的全局样式 -->
    <link href="../static/css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
    <script src="../static/js/jquery-3.7.1.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="../static/js/bootstrap.min.js"></script>
    <style>
        /* 自定义样式 */
        .selectpicker {
            border-radius: 20px;
            transition: all 0.3s ease;
            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
        }

        .selectpicker:hover {
            border-color: #66afe9;
            box-shadow: 0 2px 8px rgba(102, 175, 233, .6);
        }

        .bootstrap-select .dropdown-menu {
            border-radius: 15px;
            margin-top: 5px;
        }

        .bootstrap-select.btn-group .dropdown-toggle .filter-option {
            font-weight: 500;
        }

        .dropdown-menu > li > a {
            padding: 10px 20px;
            transition: background 0.3s;
        }

        .dropdown-menu > li > a:hover {
            background: linear-gradient(to right, #f8f9fa, #e9ecef);
            color: #333;
        }
    </style>
</head>
<body>
地址:
<select id="se1">
    <option>--请选择--</option>
</select>省
<select id="se2">
    <option>--请选择--</option>
</select>市
<select id="se3">
    <option>--请选择--</option>
</select>县

{#<div class="container" style="margin-top: 30px;">#}
{#    <div class="row">#}
{##}
{##}
{#        <div class="col-sm-4">#}
{#            <div class="form-group">#}
{#                <select id="se" class="selectpicker form-control" data-style="btn-primary" title="-- 请选择省份 --">#}
                    {#                    {% for province in provinces %}#}
                    {#                        <option value="{{ province.id }}"#}
                    {#                                {% if province.id == selected_id %}selected{% endif %}>#}
                    {#                            {{ province.name }}#}
                    {#                        </option>#}
                    {#                    {% endfor %}#}
                    {#                    {% for province in provinces %}#}
                    {#                        <option value="{{ province.id }}">{{ province.name }}</option>#}
                    {#                    {% endfor %}#}
{#                </select>#}
{#            </div>#}
{#        </div>#}
{##}
{##}
{#        <div class="col-sm-4">#}
{#            <div class="form-group">#}
{#                <select id="se1" class="selectpicker form-control" data-style="btn-success" title="-- 请选择城市 --">#}
{#                </select>#}
{#            </div>#}
{#        </div>#}
{##}
{#        <div class="col-sm-4">#}
{#            <div class="form-group">#}
{#                <select id="se2" class="selectpicker form-control" data-style="btn-info" title="-- 请选择区县 --">#}
{#                </select>#}
{#            </div>#}
{#        </div>#}
{#    </div>#}
{#</div>#}

<script>
      //页面就绪函数
    $(function () {
        //初始化值 把省份查询出来
        $.ajax({
            url: "/three/",
            dataType: "json",
            type: "post",
            data: {
                method: "get1"
            },
            success: function (date) {
                console.log(date);
                //清空select  下拉框
                // $("#se1").children().not(":eq(0)").remove();
                //遍历数据
                for (var i = 0; i < date.length; i++) {
                    console.log(date[i].name);
                    $("#se1").append("<option value=" + date[i].id + ">--" + date[i].name + "--</option>");
                }
            }
        });

    });

    //下拉框2  当下拉框 省1内容发生改变,我就执行
    $("#se1").change(function () {
        //你选择是那个省   用来当做父id
        var id = $("#se1").val();
        // alert("下拉框被改变" + id);
        $.ajax({
            url: "/three/",
            type: "post",
            data: {
                method: "get",
                id: id
            },
            dataType: "json",
            success: function (date) {

                //清空select  下拉框
                $("#se2").children().not(":eq(0)").remove();
                $("#se3").children().not(":eq(0)").remove();
                //遍历数据
                for (var i = 0; i < date.length; i++) {
                    console.log(date[i].name);
                    //追加
                    $("#se2").append("<option value=" + date[i].id + ">--" + date[i].name + "--</option>");
                }
            }
        });
    });


    //下拉框3  当下拉框2内容发生改变,我就执行
    $("#se2").change(function () {
        var id = $("#se2").val();
        $.ajax({
            url: "/three/",
            type: "post",
            data: {
                method: "get3",
                id: id
            },
            dataType: "json",
            success: function (date) {
                //清空select  下拉框
                $("#se3").children().not(":eq(0)").remove();
                //遍历数据
                for (var i = 0; i < date.length; i++) {
                    console.log(date[i].name);
                    $("#se3").append("<option value=" + date[i].id + ">--" + date[i].name + "--</option>");
                }
            }
        });
    });

</script>

</body>
</html>

model.py
 

from django.db import models


class City(models.Model):
    name = models.CharField(max_length=50)
    province = models.ForeignKey('Province', models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'city'


class District(models.Model):
    name = models.CharField(max_length=50)
    city = models.ForeignKey(City, models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'district'
        
class Province(models.Model):
    name = models.CharField(max_length=50)

    class Meta:
        managed = False
        db_table = 'province'

view.py
 

def three(request):
    global data
    if request.method == "GET":
        print("跳转页面")
        return render(request, "三级联动.html")
    else:
        print("post请求")
        method = request.POST.get("method")
        print("[POST] 收到method参数:", method)  # 调试关键参数
        if method == "get1":
            provinces = Province.objects.all()
            print("[get1] 省份数据:", provinces)  # 验证数据格式 因为QuerySet对象本身不可序列化。所以必须先将其转换为列表或类似结构。
            data = [{'id': p.id, 'name': p.name} for p in provinces]
            print(data)
            # 建议所有数据接口返回统一格式
            return JsonResponse(data, safe=False)  # 必须转为列表 + safe=False
        elif method == 'get':
            print("[POST] 收到method参数:", method)
            parent_id = request.POST.get('id')

            cities = City.objects.filter(province=parent_id)
            data = [{'id': c.id, 'name': c.name} for c in cities]
            return JsonResponse(data, safe=False)
        elif method == 'get3':
            print("[POST] 收到method参数:", method)
            parent_id = request.POST.get('id')
            areas = District.objects.filter(city=parent_id)
            data = [{'id': a.id, 'name': a.name} for a in areas]
            return JsonResponse(data, safe=False)

url.py
 

urlpatterns = [
  
    path('three/', views.three),

]


网站公告

今日签到

点亮在社区的每一天
去签到