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的Django框架中的Context使用
Jul 15 Python
深入理解python try异常处理机制
Jun 01 Python
python实现按任意键继续执行程序
Dec 30 Python
浅谈Python中的私有变量
Feb 28 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
Feb 18 Python
python 已知三条边求三角形的角度案例
Apr 12 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 Python
python dir函数快速掌握用法技巧
Dec 09 Python
python 录制系统声音的示例
Dec 21 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
PHP配置文件中最常用四个ini函数
2007/03/19 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
再谈javascript原型继承
2014/11/10 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
Python全局变量操作详解
2015/04/14 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
基于Python检测动态物体颜色过程解析
2019/12/04 Python
Python命令行click参数用法解析
2019/12/19 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
python 装饰器的使用示例
2020/10/10 Python
python os.listdir()乱码解决方案
2021/01/31 Python
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
实习鉴定范文
2013/12/19 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
2015年度个人业务工作总结
2015/04/27 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
500字作文之周记
2019/12/13 职场文书
pycharm无法导入lxml的解决办法
2021/03/31 Python