一  使用环境

  开发系统: windows

  IDE: pycharm  

  数据库: msyql,navicat

  编程语言: python3.7  (Windows x86-64 executable installer)

  虚拟环境: virtualenvwrapper

  开发框架: Django 2.2

  Django 2.2通病===>访问admin出现问题:

  报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence

  解决方法:https://www.cnblogs.com/djtang/p/10194811.html

二 Django Admin 实现三级联动的示例代码(省市区)===>小白级

1. 在 model.py 中

  1. from django.db import models
  2.  
  3. # 人员
  4. class Member(models.Model):
  5. name = models.CharField(max_length=100, verbose_name='姓名')
  6. province = models.ForeignKey('Province', on_delete=models.PROTECT, null=True, blank=True, verbose_name='省份')
  7. city = models.ForeignKey('City', on_delete=models.PROTECT, null=True, blank=True, verbose_name='城市')
  8. district = models.ForeignKey('District', on_delete=models.PROTECT, null=True, blank=True, verbose_name='区/县')
  9.  
  10. class Meta:
  11. verbose_name_plural = verbose_name = '00-人员'
  12.  
  13. def __str__(self):
  14. return self.name
  15.  
  16. # 省份
  17. class Province(models.Model):
  18. 省份 = models.CharField(max_length=100, null=True, blank=True, verbose_name='省份')
  19.  
  20. class Meta:
  21. verbose_name_plural = verbose_name = '01-省份'
  22.  
  23. def __str__(self):
  24. return self.省份
  25.  
  26. # 城市
  27. class City(models.Model):
  28. 城市 = models.CharField(max_length=100, null=True, blank=True, verbose_name='城市')
  29. 省份 = models.ForeignKey('Province', on_delete=models.PROTECT, null=True, blank=True, related_name='城市_省份',
  30. verbose_name='省份')
  31.  
  32. class Meta:
  33. verbose_name_plural = verbose_name = '02-城市'
  34.  
  35. def __str__(self):
  36. return self.城市
  37.  
  38. # 区/县
  39. class District(models.Model):
  40. 区县 = models.CharField(max_length=100, null=True, blank=True, verbose_name='区/县')
  41. 城市 = models.ForeignKey('City', on_delete=models.PROTECT, null=True, blank=True, related_name='区县_城市',
  42. verbose_name='城市')
  43.  
  44. class Meta:
  45. verbose_name_plural = verbose_name = '03-区/县'
  46.  
  47. def __str__(self):
  48. return self.区县

2. 在 view.py 中

  1. from django.http import JsonResponse
  2. from sjld.models import Province, City, District
  3.  
  4. # Create your views here.
  5.  
  6. # 省份
  7. def choose_province(request):
  8. 省份 = Province.objects.all()
  9. result = []
  10. for i in 省份:
  11. result.append(i.省份) # 取公司的简称
  12. province = result # 传递一个列表
  13. return JsonResponse(province, safe=False)
  14.  
  15. def choose_city(request):
  16. 省份 = request.GET.get('p') # 取上面选中省份的名称
  17. 城市 = City.objects.all()
  18. result = []
  19. for i in 城市:
  20. if str(省份) == str(i.省份):
  21. result.append(i.城市)
  22. cities = result # 传递一个列表
  23. return JsonResponse(cities, safe=False)
  24.  
  25. def choose_district(request):
  26. 城市 = request.GET.get('c') # 取上面选中城市的名称
  27. 区县 = District.objects.all()
  28. result = []
  29. for i in 区县:
  30. if str(城市) == str(i.城市):
  31. result.append(i.区县)
  32. cities = result # 传递一个列表
  33. districts = cities
  34. return JsonResponse(districts, safe=False)

3. 在 urls.py 中

  1. from django.contrib import admin
  2. from django.urls import path
  3. from sjld.views import choose_province, choose_city, choose_district
  4.  
  5. urlpatterns = [
  6. path('admin/', admin.site.urls),
  7. path('province/', choose_province),
  8. path('city/', choose_city),
  9. path('district/', choose_district),
  10. ]

4. 在 admin.py 中

  1. from django import forms
  2. from django.contrib import admin
  3. from shanjld.models import Member, Province, City, District
  4.  
  5. class MemberForm(forms.ModelForm):
  6. class Meta:
  7. widgets = {
  8. 'province': forms.Select(),
  9. 'city': forms.Select(),
  10. 'district': forms.Select()
  11. }
  12.  
  13. # 人员
  14. @admin.register(Member)
  15. class MemberAdmin(admin.ModelAdmin):
  16. form = MemberForm
  17. change_form_template = 'area.html'
  18. # raw_id_fields = ('province', 'city', 'district',) # 这个在这里就无效了,希望哪位大老指点一下,怎么重写这个方法.
  19. fields = ('name', 'province', 'city', 'district')
  20. list_display = ('name', 'province', 'city', 'district')
  21.  
  22. # 省份
  23. @admin.register(Province)
  24. class ProvinceAdmin(admin.ModelAdmin):
  25. pass
  26.  
  27. # 城市
  28. @admin.register(City)
  29. class CityAdmin(admin.ModelAdmin):
  30. raw_id_fields = ('省份',)
  31.  
  32. # 区/县
  33. @admin.register(District)
  34. class DistrictAdmin(admin.ModelAdmin):
  35. raw_id_fields = ('城市',)

5. 在项目 templates 文件下新建一个 area.html 文件

6. 找到django源码中的 change_form.html 文件,打开复制里面全部的html内容到 area.html 中. (文件在 External Libraries => python3.7(我用的这个版本) => site-packages =>  django/contrib/admin/templates/admin/).

7. 在 area.html 文件中找到  {% block admin_change_form_document_ready %} (在66行) , 用下面代码覆盖全部 {% block admin_change_form_document_ready %} .

7.1  area.html 中所有增加替换代码

  1. {% block admin_change_form_document_ready %}
  2. <script type="text/javascript"
  3. id="django-admin-form-add-constants"
  4. src="{% static 'admin/js/change_form.js' %}"
  5. {% if adminform and add %}
  6. data-model-name="{{ opts.model_name }}"
  7. {% endif %}>
  8. </script>
  9. <script type="text/javascript">
  10. (function($) {
  11. $('#id_city').change(function() {
  12. let p_id = $('#id_province').val();
  13. let c_id = $('#id_city').val();
  14. $.get('/district/', {"p": p_id, "c": c_id }, function(a_info) {
  15. var area_info = $('#id_district').empty().append('<option value>' + '---------' + '</option>');
  16. $.each(a_info, function(i, area) {
  17. area_info.append('<option value="' + area + '">' + area + '</option>')
  18. });
  19. {% if change %}
  20. $("#id_district").find("option:contains({{ original.district }})").attr('selected', true);
  21. {% endif %}
  22. });
  23. });
  24.  
  25. $('#id_province').change(function() {
  26. let p_id = $('#id_province').val();
  27. $.get('/city/', { 'p': p_id }, function(c_info) {
  28. var city_info = $('#id_city').empty().append('<option value>' + '---------' + '</option>');
  29. $.each(c_info, function(i, city) {
  30. city_info.append('<option value="' + city + '">' + city + '</option>')
  31. });
  32. {% if change %}
  33. $("#id_city").find("option:contains({{ original.city }})").attr('selected', true);
  34. $("#id_city").trigger("change");
  35. {% endif %}
  36. });
  37. });
  38.  
  39. $.get('/province/', function(p_info) {
  40. var province_info = $('#id_province').empty().append('<option value>' + '---------' + '</option>');
  41. $.each(p_info, function(i, province) {
  42. province_info.append('<option value="' + province + '">' + province + '</option>')
  43. });
  44. {% if change %}
  45. $("#id_province").find("option:contains({{ original.province }})").attr('selected', true);
  46. $("#id_province").trigger("change");
  47. {% endif %}
  48. });
  49. })(django.jQuery);
  50. </script>
  51. {% endblock %}

7.2  area.html 中所有代码

  1. {% extends "admin/base_site.html" %}
  2. {% load i18n admin_urls static admin_modify %}
  3.  
  4. {% block extrahead %}{{ block.super }}
  5. <script type="text/javascript" src="{% url 'admin:jsi18n' %}"></script>
  6. {{ media }}
  7. {% endblock %}
  8.  
  9. {% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">{% endblock %}
  10.  
  11. {% block coltype %}colM{% endblock %}
  12.  
  13. {% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %}
  14.  
  15. {% if not is_popup %}
  16. {% block breadcrumbs %}
  17. <div class="breadcrumbs">
  18. <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
  19. &rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
  20. &rsaquo; {% if has_view_permission %}<a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %}
  21. &rsaquo; {% if add %}{% blocktrans with name=opts.verbose_name %}Add {{ name }}{% endblocktrans %}{% else %}{{ original|truncatewords:"18" }}{% endif %}
  22. </div>
  23. {% endblock %}
  24. {% endif %}
  25.  
  26. {% block content %}<div id="content-main">
  27. {% block object-tools %}
  28. {% if change %}{% if not is_popup %}
  29. <ul class="object-tools">
  30. {% block object-tools-items %}
  31. {% change_form_object_tools %}
  32. {% endblock %}
  33. </ul>
  34. {% endif %}{% endif %}
  35. {% endblock %}
  36. <form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.model_name }}_form" novalidate>{% csrf_token %}{% block form_top %}{% endblock %}
  37. <div>
  38. {% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1">{% endif %}
  39. {% if to_field %}<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}">{% endif %}
  40. {% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %}
  41. {% if errors %}
  42. <p class="errornote">
  43. {% if errors|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %}
  44. </p>
  45. {{ adminform.form.non_field_errors }}
  46. {% endif %}
  47.  
  48. {% block field_sets %}
  49. {% for fieldset in adminform %}
  50. {% include "admin/includes/fieldset.html" %}
  51. {% endfor %}
  52. {% endblock %}
  53.  
  54. {% block after_field_sets %}{% endblock %}
  55.  
  56. {% block inline_field_sets %}
  57. {% for inline_admin_formset in inline_admin_formsets %}
  58. {% include inline_admin_formset.opts.template %}
  59. {% endfor %}
  60. {% endblock %}
  61.  
  62. {% block after_related_objects %}{% endblock %}
  63.  
  64. {% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
  65.  
  66. {% block admin_change_form_document_ready %}
  67. <script type="text/javascript"
  68. id="django-admin-form-add-constants"
  69. src="{% static 'admin/js/change_form.js' %}"
  70. {% if adminform and add %}
  71. data-model-name="{{ opts.model_name }}"
  72. {% endif %}>
  73. </script>
  74. {% endblock %}
  75.  
  76. {# JavaScript for prepopulated fields #}
  77. {% prepopulated_fields_js %}
  78.  
  79. </div>
  80. </form></div>
  81. {% endblock %}

8.效果

9.访问admin出现问题:

报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence

解决方法:https://www.cnblogs.com/djtang/p/10194811.html

10.请各位大老多多指点! ===> 个人微信:DJtang009

Django Admin 实现三级联动的示例代码(省市区)===>小白级的更多相关文章

  1. Django Admin实现三级联动(省市区)

    通过自定义Admin的模板文件实现省市区的三级联动.要求创建记录时,根据省>市>区的顺序选择依次显示对应数据. 修改记录时默认显示已存在的数据. Model class Member(mo ...

  2. 【转】纯JS省市区三级联动(行政区划代码更新至2015-9-30)

    本文代码实现的功能是省市区三级联动下拉列表,纯Javascript,网上已有很多这方面的代码.但是作为一个新手,这是我的第一篇CSDN博客,发此文的目的主要是学习交流,希望看到的朋友发现有什么不对的地 ...

  3. 记录 vant Picker 选择器,实现三级联动,传对应省市区code值

    最近使用vant UI写移动端,感觉还不错 功能挺全的,带的还有省市区三级联动. 但是 突然遇到一个 产品要传的 省市区的code码,还和vant的 邮编不一样,我*****. 看了一下vant UI ...

  4. 二级联动,三级联动,初学者,纯javascript,不含jQuery

    二级联动: html代码: <body> <select id="province" onchange="getCity(this.options.se ...

  5. 微信小程序 地区选择器 和省市县三级联动 和button按钮分享

    wxml代码: <view class="section__title"> 地区选择器 </view> <picker bindchange=&quo ...

  6. 省市区三级联动——思路、demo、示例

    说明(2017-12-13 11:03:58): 1. 这个功能应该是注册的时候非常.常用的了,不过现在都是微信登录,手机端自动获取位置什么的,可能就网站还用用吧! 2. 这个东西的难点在于统计各地省 ...

  7. 省市县三级联动js代码

    省市县三级联动菜单,JS全国省市县(区)联动代码,一般可以用于用户注册或分类信息二手交易网站,需要的朋友直接复制代码就可以用了,不过有朋友反馈说缺少某些城市,具体缺少哪个尚不知,请想用的朋友自己补全吧 ...

  8. Django之上传图片,分页,三级联动

    Django1.8.2中文文档:Django1.8.2中文文档 上传图片 配置上传文件保存目录 1)新建上传文件保存目录. 2)配置上传文件保存目录. 后台管理页面上传图片 1)设计模型类. 2)迁移 ...

  9. js封装的三级联动菜单(使用时只需要一行js代码)

    前言 在实际的项目开发中,我们经常需要三级联动,比如省市区的选择,商品的三级分类的选择等等. 而网上却找不到一个代码完整.功能强大.使用简单的三级联动菜单,大都只是简单的讲了一下实现思路. 下面就给大 ...

随机推荐

  1. 简述vue-cli 2.x和vue-cli 3+在项目构建、运行、编译执行时的区别

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14363272.html 关于VUE的项目,有个问题一直不是特别清楚 ,不同公司的项目 ...

  2. ArrayList源码分析(JDK1.8)

    概述 ArrayList底层是基于数组实现的,并且支持动态扩容的动态数组(变长的集合类).ArrayList允许空值和重复的元素,当向ArrayList中添加元素数量大于其底层数组容量时,会通过扩容机 ...

  3. JVM之堆参数

    1.Java 7和Java 8区别 Java 7堆结构 JDK 1.8之后将最初的永久代取消了,由元空间取代. 在Java8中,永久代已经被移除,被一个称为元空间的区域所取代.元空间的本质和永久代类似 ...

  4. 2019 Multi-University Training Contest 2 Harmonious Army(最小割)

    题意:给你n个点 每个点都有两种选择 成为战士或者法师 现在给你m个关系 对应这两个人的对应关系的权值A,B,C 思路:按照下面的思路建图跑最小割(要注意权值要乘2 可能存在不整除的情况) #incl ...

  5. Codeforces Round #668 (Div. 2)【ABCD】

    比赛链接:https://codeforces.com/contest/1405 A. Permutation Forgery 题意 给出一个大小为 $n$ 的排列 $p$,定义 \begin{equ ...

  6. AtCoder - agc043_a 和 POJ - 2336 dp

    题意: 给你一个n行m列由'#'和'.'构成的矩阵,你需要从(1,1)点走到(n,m)点,你每次只能向右或者向下走,且只能走'.'的位置. 你可以执行操作改变矩阵: 你可以选取两个点,r0,c0;r1 ...

  7. vector总结

    vector是不定长数组,具有静态数组的稳定性和动态分配内存的灵活性,在赛场上不失为指针之外牺牲部分时间的保险之举. 本文先介绍一些vector常用的函数(部分借鉴一篇博客中的内容 链接),并以此为铺 ...

  8. 【uva 1612】Guess(算法效率,2种想法)

    题意:已知 N 位选手的3题的预期得分,得分要不全拿,要不为0.且知道最后的实际名次,而且得分相同的选手,ID小的排在前面.问这样的名次可能吗.若可能,输出最后一名的最高可能得分.(N≤16384) ...

  9. 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)

    题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...

  10. 【noi 2.6_9280】&【bzoj 1089】严格n元树(DP+高精度+重载运算符)

    题意:定义一棵树的所有非叶节点都恰好有n个儿子为严格n元树.问深度为d的严格n元树数目. 解法:f[i]表示深度为<=i的严格n元树数目.f[i]-f[i-1]表示深度为i的严格n元树数目.f[ ...