Djago-自关联例子(选择省市县信息)

models.py

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

views.py

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)

urls.py

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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值