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使用ctypes模块调用windowsapi获取系统版本示例
Apr 17 Python
Python Web开发模板引擎优缺点总结
May 06 Python
用Python制作简单的朴素基数估计器的教程
Apr 01 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
详解如何使用Python编写vim插件
Nov 28 Python
Python队列RabbitMQ 使用方法实例记录
Aug 05 Python
Python爬虫 批量爬取下载抖音视频代码实例
Aug 16 Python
使用Keras实现简单线性回归模型操作
Jun 12 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
详解python 支持向量机(SVM)算法
Sep 18 Python
Python答题卡识别并给出分数的实现代码
Jun 22 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
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
vue实现扫码功能
2020/01/17 Javascript
python实现的简单FTP上传下载文件实例
2015/06/30 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
Python 串口读写的实现方法
2019/06/12 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
python如何安装下载后的模块
2020/07/03 Python
Python通过字典映射函数实现switch
2020/11/06 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
敬业奉献模范事迹材料
2014/12/24 职场文书
小学推普周活动总结
2015/05/07 职场文书
大学生党课心得体会
2016/01/07 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python
解决Go gorm踩过的坑
2021/04/30 Golang
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js