Django Admin实现三级联动的示例代码(省市区)


Posted in Python onJune 22, 2018

通过自定义Admin的模板文件实现省市区的三级联动.要求创建记录时,根据省>市>区的顺序选择依次显示对应数据.

修改记录时默认显示已存在的数据.

Django Admin实现三级联动的示例代码(省市区)

Django Admin实现三级联动的示例代码(省市区)

Model

class Member(models.Model):
  name = models.CharField(max_length=100, verbose_name='姓名')
  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='区/县')

  class Meta:
    verbose_name_plural = verbose_name = '人员'

  def __str__(self):
    return self.name

View和url

# views
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)
  
# urls
from person.views import choose_province, choose_city, choose_district

urlpatterns = [
  path('province/', choose_province),
  path('city/', choose_city),
  path('district/', choose_district),
  path('admin/', admin.site.urls),
]

Admin

class MemberForm(forms.ModelForm):
  class Meta:
    widgets = {
      'province': forms.Select(),
      'city': forms.Select(),
      'district': forms.Select()
    }

@admin.register(Member)
class MemberAdmin(admin.ModelAdmin):
  form = MemberForm
  fields = ('name', ('province', 'city', 'district'))
  list_display = ('name', 'province', 'city', 'district')
  change_form_template = 'area.html'

这里需要写一个form将省市区这三个字段显示为单选框.

模板文件

找到django源码中的change_form.html(django/contrib/admin/templates/admin/)文件,复制到app下templates目录中.

在admin中指定自定义的模板文件 change_form_template = 'area.html'

{% block admin_change_form_document_ready %}
  <script type="text/javascript"
      id="django-admin-form-add-constants"
      src="{% static 'admin/js/change_form.js' %}"
      {% if adminform and add %}
        data-model-name="{{ opts.model_name }}"
      {% endif %}>
  </script>

  <script type="text/javascript">
    (function($) {
      $('#id_city').change(function() {
        let p_id = $('#id_province').val();
        let c_id = $('#id_city').val();
        $.get('/district/', {"p": p_id, "c": c_id }, function(a_info) {
          var area_info = $('#id_district').empty().append('<option value>' + '---------' + '</option>');
          $.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 %}
        });
      });

      $('#id_province').change(function() {
        let p_id = $('#id_province').val();
        $.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 %}
        });
      });

      $.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>

参考: https://3water.com/article/142409.htm

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
如何在Python中编写并发程序
Feb 27 Python
Django实现简单分页功能的方法详解
Dec 05 Python
Python xlwt设置excel单元格字体及格式
Apr 18 Python
Flask框架各种常见装饰器示例
Jul 17 Python
django框架基于模板 生成 excel(xls) 文件操作示例
Jun 19 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
python3在同一行内输入n个数并用列表保存的例子
Jul 20 Python
python 实现视频 图像帧提取
Dec 10 Python
如何使用python代码操作git代码
Feb 29 Python
如何验证python安装成功
Jul 06 Python
Python打包为exe详细教程
May 18 Python
详解python中的json和字典dict
Jun 22 #Python
python实现雨滴下落到地面效果
Jun 21 #Python
使用python读取csv文件快速插入数据库的实例
Jun 21 #Python
详解python3中tkinter知识点
Jun 21 #Python
Python3用tkinter和PIL实现看图工具
Jun 21 #Python
Python3.4 tkinter,PIL图片转换
Jun 21 #Python
Python3实现转换Image图片格式
Jun 21 #Python
You might like
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
用 PHP5 轻松解析 XML
2006/12/04 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
php自定义函数实现统计中文字符串长度的方法小结
2017/04/15 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
jQuery实现动画效果的实例代码
2013/05/07 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
Angular.js与Bootstrap相结合实现手风琴菜单代码
2016/04/13 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
Python生成不重复随机值的方法
2015/05/11 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
python是怎么被发明的
2020/06/15 Python
python中元组的用法整理
2020/06/15 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
打架检讨书2000字
2014/02/22 职场文书
挂牌仪式主持词
2014/03/20 职场文书
班级学习计划书
2014/04/27 职场文书
庆七一活动总结
2014/08/27 职场文书
地陪导游欢迎词
2015/01/26 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
Windows11 Insider Preview Build 25206今日发布 更新内容汇总
2022/09/23 数码科技