django三级联动

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

python 复制代码
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

python 复制代码
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

python 复制代码
urlpatterns = [
  
    path('three/', views.three),

]
相关推荐
Bi8bo71 分钟前
Python编程基础
开发语言·python
项目題供诗4 分钟前
黑马python(七)
python
是紫焅呢40 分钟前
N数据分析pandas基础.py
python·青少年编程·数据挖掘·数据分析·pandas·学习方法·visual studio code
该用户已不存在1 小时前
8个Docker的最佳替代方案,重塑你的开发工作流
前端·后端·docker
lizhongxuan1 小时前
groupcache 工作原理
后端
胖墩会武术1 小时前
Black自动格式化工具
python·格式化·black
栗然1 小时前
Spring Boot 项目中使用 MyBatis 的 @SelectProvider 注解并解决 SQL 注入的问题
java·后端
struggle20252 小时前
DIPLOMAT开源程序是基于深度学习的身份保留标记对象多动物跟踪(测试版)
人工智能·python·深度学习
发现你走远了2 小时前
什么是状态机?状态机入门
python·状态机
倔强的石头_2 小时前
【C++指南】类和对象(九):内部类
后端