一  使用环境

  开发系统: 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 中

from django.db import models

# 人员
class Member(models.Model):
name = models.CharField(max_length=100, verbose_name='姓名')
province = models.ForeignKey('Province', on_delete=models.PROTECT, null=True, blank=True, verbose_name='省份')
city = models.ForeignKey('City', on_delete=models.PROTECT, null=True, blank=True, verbose_name='城市')
district = models.ForeignKey('District', on_delete=models.PROTECT, null=True, blank=True, verbose_name='区/县') class Meta:
verbose_name_plural = verbose_name = '00-人员' def __str__(self):
return self.name # 省份
class Province(models.Model):
省份 = models.CharField(max_length=100, null=True, blank=True, verbose_name='省份') class Meta:
verbose_name_plural = verbose_name = '01-省份' def __str__(self):
return self.省份 # 城市
class City(models.Model):
城市 = models.CharField(max_length=100, null=True, blank=True, verbose_name='城市')
省份 = models.ForeignKey('Province', on_delete=models.PROTECT, null=True, blank=True, related_name='城市_省份',
verbose_name='省份') class Meta:
verbose_name_plural = verbose_name = '02-城市' def __str__(self):
return self.城市 # 区/县
class District(models.Model):
区县 = models.CharField(max_length=100, null=True, blank=True, verbose_name='区/县')
城市 = models.ForeignKey('City', on_delete=models.PROTECT, null=True, blank=True, related_name='区县_城市',
verbose_name='城市') class Meta:
verbose_name_plural = verbose_name = '03-区/县' def __str__(self):
return self.区县

2. 在 view.py 中

from django.http import JsonResponse
from sjld.models import Province, City, District # Create your views here. # 省份
def choose_province(request):
省份 = Province.objects.all()
result = []
for i in 省份:
result.append(i.省份) # 取公司的简称
province = result # 传递一个列表
return JsonResponse(province, safe=False) def choose_city(request):
省份 = request.GET.get('p') # 取上面选中省份的名称
城市 = City.objects.all()
result = []
for i in 城市:
if str(省份) == str(i.省份):
result.append(i.城市)
cities = result # 传递一个列表
return JsonResponse(cities, safe=False) def choose_district(request):
城市 = request.GET.get('c') # 取上面选中城市的名称
区县 = District.objects.all()
result = []
for i in 区县:
if str(城市) == str(i.城市):
result.append(i.区县)
cities = result # 传递一个列表
districts = cities
return JsonResponse(districts, safe=False)

3. 在 urls.py 中

from django.contrib import admin
from django.urls import path
from sjld.views import choose_province, choose_city, choose_district urlpatterns = [
path('admin/', admin.site.urls),
path('province/', choose_province),
path('city/', choose_city),
path('district/', choose_district),
]

4. 在 admin.py 中

from django import forms
from django.contrib import admin
from shanjld.models import Member, Province, City, District 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
change_form_template = 'area.html'
# raw_id_fields = ('province', 'city', 'district',) # 这个在这里就无效了,希望哪位大老指点一下,怎么重写这个方法.
fields = ('name', 'province', 'city', 'district')
list_display = ('name', 'province', 'city', 'district') # 省份
@admin.register(Province)
class ProvinceAdmin(admin.ModelAdmin):
pass # 城市
@admin.register(City)
class CityAdmin(admin.ModelAdmin):
raw_id_fields = ('省份',) # 区/县
@admin.register(District)
class DistrictAdmin(admin.ModelAdmin):
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 中所有增加替换代码

            {% 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>
{% endblock %}

7.2  area.html 中所有代码

{% extends "admin/base_site.html" %}
{% load i18n admin_urls static admin_modify %} {% block extrahead %}{{ block.super }}
<script type="text/javascript" src="{% url 'admin:jsi18n' %}"></script>
{{ media }}
{% endblock %} {% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">{% endblock %} {% block coltype %}colM{% endblock %} {% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %} {% if not is_popup %}
{% block breadcrumbs %}
<div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
&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 %}
&rsaquo; {% if add %}{% blocktrans with name=opts.verbose_name %}Add {{ name }}{% endblocktrans %}{% else %}{{ original|truncatewords:"18" }}{% endif %}
</div>
{% endblock %}
{% endif %} {% block content %}<div id="content-main">
{% block object-tools %}
{% if change %}{% if not is_popup %}
<ul class="object-tools">
{% block object-tools-items %}
{% change_form_object_tools %}
{% endblock %}
</ul>
{% endif %}{% endif %}
{% endblock %}
<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 %}
<div>
{% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1">{% endif %}
{% if to_field %}<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}">{% endif %}
{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %}
{% if errors %}
<p class="errornote">
{% if errors|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %}
</p>
{{ adminform.form.non_field_errors }}
{% endif %} {% block field_sets %}
{% for fieldset in adminform %}
{% include "admin/includes/fieldset.html" %}
{% endfor %}
{% endblock %} {% block after_field_sets %}{% endblock %} {% block inline_field_sets %}
{% for inline_admin_formset in inline_admin_formsets %}
{% include inline_admin_formset.opts.template %}
{% endfor %}
{% endblock %} {% block after_related_objects %}{% endblock %} {% block submit_buttons_bottom %}{% submit_row %}{% endblock %} {% 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>
{% endblock %} {# JavaScript for prepopulated fields #}
{% prepopulated_fields_js %} </div>
</form></div>
{% 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. C/C++函数与变量前面的标识符的作用

    ​​ 作者:良知犹存 转载授权以及围观->欢迎添加Wx:Allen-Iverson-me-LYN 缅怀逝者,向英雄致敬.愿山河无恙,国泰民安. 在用C/C++写代码的时候我们经常会使用一些标识符 ...

  2. Wormholes (spfa)

    一种路是双向的,路的长度是正值:另一种路是单向的,路的长度是负值:  如果有负环输出YES:否则输出NO:不同的路可能有相同的起点和终点:必须用邻接表 While exploring his many ...

  3. 1151 LCA in a Binary Tree

    The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...

  4. 用Python修改本机适配器信息

    主要参考来自[用Python干实事(一)自动修改Windows的IP.网关和DNS设置]. 使用_winreg模块来操作注册表实现相关信息的修改,它是python的内置模块.也可以通过Win32 Ex ...

  5. Little Difference Gym - 101612L 思维

    题意: 给你一个数n,你需要输出它可以由那几个数相乘构成,我们设可以由x个数构成,这x个数中最小值为minn,最大值为maxx,那么要求maxx-minn<=1 问你满足上面要求的情况有多少种. ...

  6. 病毒侵袭 HDU - 2896 板子题

    当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~ 但网路上总有那么些网站,开 ...

  7. VS Code 配置 Java IDE

    背景 维护的项目在一个内网环境,只能通过跳转机的FTP上传文件.项目是Java spring boot开发,之前的维护人员使用sts(https://spring.io/tools),使用起来体验极差 ...

  8. PowerShell随笔10---Module

    我们总不能把所有脚本文件零散的放着,就像创建一个项目一样,我们创建一个Module. 创建好之后如何让系统认识我们创建的Module呢,我们需要放在指定的位置. 那到底应该放在什么位置呢? 我们可以通 ...

  9. MySQL菜鸟实录(一):MySQL服务安装实战

    CentOS 7 基本信息 系统版本: CentOS 7.3 64bit 系统配置: 4vCPUs | 8GB 磁盘空间: [root@ecs-ce5a-0001 ~]# df -h Filesyst ...

  10. HTTP笔记2--简单的HTTP 协议

    HTTP概念 HTTP用于客户端和服务器之间的通信 客户端:请求访问文本或图像等资源的一端 服务器端而提供资源响应的一端 通过请求和响应的交换达成通信 HTTP 协议规定,请求从客户端发出,最后服务器 ...