from django.db import models
class AddressInfo(models.Model):
"""省市县地址信息"""
address=models.CharField(max_length=200,null=True,blank=True,verbose_name="地址")
pid=models.ForeignKey('self',null=True,blank=True,verbose_name="自关联",on_delete=models.CASCADE)
#pid=models.ForeignKey('AddressInfo',null=True,blank=True,verbose_name="自关联")
def __str__(self):
return self.address
from django.shortcuts import render
from django.views.generic import View
from .models import AddressInfo
from django.http import JsonResponse
class IndexView(View):
"""主页"""
def get(self,request):
return render(request,'address.html')
class AddressAPI(View):
"""地址信息"""
def get(self,request,address_id):#接收一个参数的id,指modde中的pid属性对应的字段,即表中的pid_id
if int(address_id)==0: #为0时表示为查询省,省的pid_id为null
address_data=AddressInfo.objects.filter(pid__isnull=True).values('id','address')
else:
address_data=AddressInfo.objects.filter(pid_id=int(address_id)).values('id','address')
area_list=[]#转成list后json序列化
for a in address_data:
area_list.append({'id':a['id'],'address':a['address']})
#然后通过jsonResponse返回给请求方,这里是list而不是dict,所以safe需要传入False
return JsonResponse(area_list,content_type='application/json',safe=False)
from django.contrib import admin
from django.urls import path,re_path
from orm.views import AddressAPI,IndexView
urlpatterns = [
path('admin/', admin.site.urls),
path('',IndexView.as_view(),name='index'),
re_path('address/(\d+)$',AddressAPI.as_view(),name='address')
]
address.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<select id="pro">
<option value="">请选择省</option>
</select>
<select id="city">
<option value="">请选择市</option>
</select>
<select id="dis">
<option value="">请选择县</option>
</select>
</body>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>
address=function (a,b) {
$.get('/address/'+a,function (dic) {
$.each(dic,function (index,item) {
b.append('<option value="' + item.id + '">' + item.address + '</option>')
})
})
};
$(function () {
pro=$('#pro');
city=$('#city');
dis=$('#dis');
//查询省信息
address(0,pro);
//根据省改变查询市信息
pro.change(function () {
city.empty().append('<option value="">请选择市</option>');
dis.empty().append('<option value="">请选择县</option>');
address(this.value,city)
});
//根据市的改变查询县的信息
city.change(function () {
dis.empty().append('<option value="">请选择县</option>');
address(this.value,dis)
})
})
</script>
</html>