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常见数制转换实例分析
May 09 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 Python
python基础教程之匿名函数lambda
Jan 17 Python
不可错过的十本Python好书
Jul 06 Python
python Crypto模块的安装与使用方法
Dec 21 Python
python版本的仿windows计划任务工具
Apr 30 Python
python实现飞机大战
Sep 11 Python
python中的for循环
Sep 28 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
keras获得某一层或者某层权重的输出实例
Jan 24 Python
Jupyter notebook 远程配置及SSL加密教程
Apr 14 Python
python 统计代码耗时的几种方法分享
Apr 02 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
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
JavaScript获取对象在页面中位置坐标的方法
2016/02/03 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
Angularjs的键盘事件的绑定
2017/07/27 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
Python生成随机验证码的两种方法
2015/12/22 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
python实现大文件分割与合并
2019/07/22 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
python实现飞机大战项目
2020/03/11 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
Django框架请求生命周期实现原理
2020/11/13 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
小学生毕业评语
2014/12/26 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
MySQL约束超详解
2021/09/04 MySQL
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android