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 pdb调试方法分享
Jan 21 Python
Python日志模块logging简介
Apr 13 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
Jun 16 Python
教你用python3根据关键词爬取百度百科的内容
Aug 18 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
Nov 16 Python
Python自动化运维_文件内容差异对比分析
Dec 13 Python
Python中join函数简单代码示例
Jan 09 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
用Python画小女孩放风筝的示例
Nov 23 Python
Python解析json代码实例解析
Nov 25 Python
Python Numpy 自然数填充数组的实现
Nov 28 Python
宝塔更新Python及Flask项目的部署
Apr 11 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
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
jQuery实现别踩白块儿网页版小游戏
2017/01/18 Javascript
js实现移动端轮播图效果
2020/12/09 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python命令行参数sys.argv使用示例
2014/01/28 Python
Python中random模块用法实例分析
2015/05/19 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python编程pygal绘图实例之XY线
2017/12/09 Python
Atom的python插件和常用插件说明
2018/07/08 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
Python pandas实现excel工作表合并功能详解
2019/08/29 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
python实现飞机大战项目
2020/03/11 Python
Python通过Pillow实现图片对比
2020/04/29 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
Flask处理Web表单的实现方法
2021/01/31 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
Django实现简单的分页功能
2021/02/22 Python
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
联想新加坡官方网站:Lenovo Singapore
2017/10/24 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
求职简历推荐信范文
2013/12/02 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
党支部换届选举方案
2014/05/08 职场文书
水电站项目建议书
2014/05/12 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书