前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django admin后台的新增页面,修改页面,实现城市的三级联动,需要修改源码(有代码)

django admin后台的新增页面,修改页面,实现城市的三级联动,需要修改源码(有代码)

作者头像
一写代码就开心
发布2022-06-05 12:04:22
1.2K0
发布2022-06-05 12:04:22
举报
文章被收录于专栏:java和python

目录

1 需求

在django的admin后台的新增页面和修改页面,实现三级联动,就是你选择一个省份,下面的城市就是这个省份的,选择不同的省份,下面就是不同的城市,实现这种联动

2 实现

首先是建立一个表

代码语言:javascript
复制
class City(models.Model):
    province = models.CharField(max_length=100, null=True, blank=True, verbose_name='省份')
    city = models.CharField(max_length=100, null=True, blank=True, verbose_name='城市')
    district = models.CharField(max_length=100, null=True, blank=True, verbose_name='区/县')


    def __str__(self):
        return self.province

    class Meta:
        verbose_name_plural = verbose_name = '城市'
        db_table = 'City'

将这个表生成到数据库里面,在admin.py里面注册到admin的后台

代码语言:javascript
复制
class CityForm(forms.ModelForm):
    class Meta:
        widgets = {
            'province': forms.Select(),
            'city': forms.Select(),
            'district': forms.Select(),
        }

class CityAdmin(admin.ModelAdmin):
    form = CityForm
    fields = ( 'province', 'city', 'district')
    list_display = ( 'province', 'city', 'district')


admin.site.register(City, CityAdmin)

写相关的接口

代码语言:javascript
复制
    url(r'^province/$', views.choose_province, name='city'),  #
    url(r'^city/$', views.choose_city, name='shi'),  #
    url(r'^district/$', views.choose_district, name='xian'),  #

我是在代码里面写死了城市,你可以将逻辑改为从数据库查询数据,反正返回的东西一样就可以

代码语言:javascript
复制
LOCATION = {
    '山西省':
        {'太原市':
             ['小店区', '杏花岭', '迎泽区']
         },
    '吉林省':
        {'长春市':
             ['南关区', '朝阳区', '二道区', '绿园区']
         },
    '海南省':
        {'海口市':
             ['龙华区', '琼山区', '美兰区']
         }
}


# 返回省
def choose_province(request):
    province = list(LOCATION.keys())
    return JsonResponse(province, safe=False)
#  返回市
def choose_city(request):
    province = request.GET.get('p')
    cities = list(LOCATION[province].keys())
    return JsonResponse(cities, safe=False)

# 返回县
def choose_district(request):
    province = request.GET.get('p')
    city = request.GET.get('c')
    districts = LOCATION[province][city]
    return JsonResponse(districts, safe=False)

之后就是重写页面,我使用的是simplue的UI框架,所以找到他源码里面的这个文件

在自己的模板下创建相同的目录

然后将源码里面的东西复制进去

然后里面的东西什么都不变,在最下面加上这个

代码语言:javascript
复制
<script type="text/javascript">
(function($) {
            $('#id_city').change(function() {
                let p_id = $('#id_province').val();
                let c_id = $('#id_city').val();
                if (p_id && c_id ){
                    $.get('/district/', {"p": p_id, "c": c_id }, function(a_info) {
                        var area_info = $('#id_district').empty().append('<option value>' + '---------' + '</option>');
                        console.log(a_info);
                        $.each(a_info, function(i, area) {
                            area_info.append('<option value="' + area + '">' + area + '</option>')
                        });
                        {% if change %}
                            $("#id_district").find("option:contains({{ original.district }})").attr('selected', true);
                        {% endif %}
                    });

                }else {
                    $('#id_district').empty()
                }

            });

            $('#id_province').change(function() {
                let p_id = $('#id_province').val();

                 if (p_id ) {
                     $.get('/city/', {'p': p_id}, function (c_info) {
                         var city_info = $('#id_city').empty().append('<option value>' + '---------' + '</option>');
                         $.each(c_info, function (i, city) {
                             city_info.append('<option value="' + city + '">' + city + '</option>')
                         });
                         {% if change %}
                             $("#id_city").find("option:contains({{ original.city }})").attr('selected', true);
                             $("#id_city").trigger("change");
                         {% endif %}
                     });
                 }else {
                    $('#id_district').empty()
                     $('#id_city').empty()
                }
            });

            $.get('/province/', function(p_info) {
                var province_info = $('#id_province').empty().append('<option value>' + '---------' + '</option>');
                $.each(p_info, function(i, province) {
                    province_info.append('<option value="' + province + '">' + province + '</option>')
                });
                {% if change %}
                    $("#id_province").find("option:contains({{ original.province }})").attr('selected', true);
                    $("#id_province").trigger("change");
                {% endif %}
            });
        })(django.jQuery);


</script>

以上就可以了,实现了三级联动;

最终的结果就是

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 1 需求
  • 2 实现
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档