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),

]
相关推荐
秋山落叶万岭花开ღ2 分钟前
探索数据结构之顺序表:从入门到精通
数据结构·python·算法
熵减画眉38 分钟前
科技趋势分析系统(BBC)技术全解
人工智能·python·科技·机器学习·unity·自然语言处理·游戏引擎
赵谨言1 小时前
基于Python技术的面部考勤微信小程序的设计与实现
经验分享·python·毕业设计
plalap1 小时前
go tour方法和接口
开发语言·后端·golang
abcnull1 小时前
springboot中过滤器配置使用
java·spring boot·后端·springmvc·过滤器
小喵喵生气气2 小时前
Python60日基础学习打卡D36
python·深度学习·机器学习
zhanghongyi_cpp4 小时前
5. 【竞赛】“3+1+2”新高考选考科目问题
python
清水白石0085 小时前
WebSockets 在实时通信中的应用与优化
开发语言·汇编·python·websockets
!!!5258 小时前
在SpringBoot项目中策略模式的使用
spring boot·后端·策略模式
心软且酷丶8 小时前
leetcode:2160. 拆分数位后四位数字的最小和(python3解法,数学相关算法题)
python·算法·leetcode