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 小时前
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
分布式·python·架构·kubernetes·爬虫代理·监测·采集
ai小鬼头5 小时前
Ollama+OpenWeb最新版0.42+0.3.35一键安装教程,轻松搞定AI模型部署
后端·架构·github
萧曵 丶6 小时前
Rust 所有权系统:深入浅出指南
开发语言·后端·rust
老任与码6 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
蹦蹦跳跳真可爱5896 小时前
Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)
人工智能·python·opencv·计算机视觉
nananaij6 小时前
【Python进阶篇 面向对象程序设计(3) 继承】
开发语言·python·神经网络·pycharm
雷羿 LexChien6 小时前
从 Prompt 管理到人格稳定:探索 Cursor AI 编辑器如何赋能 Prompt 工程与人格风格设计(上)
人工智能·python·llm·编辑器·prompt
华子w9089258597 小时前
基于 SpringBoot+VueJS 的农产品研究报告管理系统设计与实现
vue.js·spring boot·后端
星辰离彬7 小时前
Java 与 MySQL 性能优化:Java应用中MySQL慢SQL诊断与优化实战
java·后端·sql·mysql·性能优化
敲键盘的小夜猫7 小时前
LLM复杂记忆存储-多会话隔离案例实战
人工智能·python·langchain