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中的并发编程实例
Jul 07 Python
Python模仿POST提交HTTP数据及使用Cookie值的方法
Nov 10 Python
Python3访问并下载网页内容的方法
Jul 28 Python
Python列表删除的三种方法代码分享
Oct 31 Python
Python3.6简单反射操作示例
Jun 14 Python
python Tkinter版学生管理系统
Feb 20 Python
使用Python的networkx绘制精美网络图教程
Nov 21 Python
在python中利用try..except来代替if..else的用法
Dec 19 Python
Python实现在Windows平台修改文件属性
Mar 05 Python
Python logging模块写入中文出现乱码
May 21 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
Python面向对象之内置函数相关知识总结
Jun 24 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
Terran剧情介绍
2020/03/14 星际争霸
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
2012/12/04 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
2013/01/25 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
vue-cli 打包后提交到线上出现 &quot;Uncaught SyntaxError:Unexpected token&quot; 报错
2018/11/06 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
在Django框架中运行Python应用全攻略
2015/07/17 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
HTML5 微格式和相关的属性名称
2010/02/10 HTML / CSS
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
国家助学金获奖感言
2014/01/31 职场文书
双语教学实施方案
2014/03/23 职场文书
年会搞笑主持词串词
2014/03/24 职场文书
语文教师个人工作总结
2015/02/06 职场文书
实习护士自荐信
2015/03/25 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python