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 Socket编程入门教程
Jul 11 Python
Python实现ssh批量登录并执行命令
Oct 25 Python
Python 描述符(Descriptor)入门
Nov 20 Python
python中defaultdict的用法详解
Jun 07 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
opencv python 傅里叶变换的使用
Jul 21 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
python encrypt 实现AES加密的实例详解
Feb 20 Python
重构Python代码的六个实例
Nov 25 Python
Django 用户认证Auth组件的使用
Nov 30 Python
python中round函数保留两位小数的方法
Dec 04 Python
一起来学习Python的元组和列表
Mar 13 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
我的论坛源代码(八)
2006/10/09 PHP
hadoop中一些常用的命令介绍
2013/06/19 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
javascript Window及document对象详细整理
2011/01/12 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
JavaScript学习笔记之Function对象
2015/01/22 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
vue实现模态框的通用写法推荐
2018/02/26 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
微信小程序如何连接Java后台
2019/08/08 Javascript
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
基于Django的python验证码(实例讲解)
2017/10/23 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
Python3爬虫学习入门教程
2018/12/11 Python
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
开办饭店创业计划书
2013/12/28 职场文书
大学生党员自我评价范文
2014/04/09 职场文书
酒店节能减排方案
2014/05/26 职场文书
药店促销活动策划方案
2014/08/24 职场文书
三严三实心得体会范文
2014/10/13 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
排查Tomcat进程假死的问题
2022/05/06 Servers