Django自關(guān)聯(lián)實(shí)現(xiàn)多級聯(lián)動查詢實(shí)例
1 問題引出
我們在開發(fā)網(wǎng)站的時候可能會遇到這種情況,多個字段之間有一定的關(guān)聯(lián)性,比如省市縣,選擇省,之后下一個選擇框的值則為該省的市集合,選擇市之后下一個選擇框的值為該市的縣集合。
一種實(shí)現(xiàn)方式是,建立三個模型表,用外鍵一對多方式,顯然這樣是不太合理的。Django提供了自關(guān)聯(lián)的實(shí)現(xiàn),模型自身關(guān)聯(lián),即一條數(shù)據(jù)關(guān)聯(lián)另一條數(shù)據(jù)。
本文以省市縣為案例介紹其具體實(shí)現(xiàn)方法。
2 具體實(shí)現(xiàn)
2.1 建立數(shù)據(jù)表Model
在model.py中建立數(shù)據(jù)表
class AdressInfo(models.Model):
address = models.CharField(max_length = 200, null = True, blank = True, verbose_name = ‘地址')
pid = models.ForeignKey(‘self' , null = True, blank = True, verbose_name = ‘自關(guān)聯(lián)')
def __str__(self):
return self.adress
說明:
name :省市縣的名字
pid:外鍵,self自關(guān)聯(lián),這里也可以使用 AdressInfo
null:為True表示可以為空,因?yàn)槭〖壭姓挝粵]有父級
blank:為True表示admin后臺數(shù)據(jù)寫入的時候可以允許為空
然后遷移數(shù)據(jù)庫
python manage.py makemigrations
python manage.py migrate
這時可以在后臺數(shù)據(jù)表中添加數(shù)據(jù)
2.2 后端url和view函數(shù)
將前端網(wǎng)頁地址映射為對應(yīng)函數(shù),用正則表達(dá)式獲取前端傳輸?shù)膒id
url.py 文件
urlpatterns = [ url(r'^addr/(\d+)$', Address.addrAPI, name = 'Addr) ]
view.py 文件
def addrAPI(request,addr_id): # 接收一個參數(shù)的id,指model中的pid屬性對應(yīng)的字段
if (int(addr_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(addr_id)).values('id','address')
area_list = []
for a in address_data:
area_list.append({'id':a['id'], 'address':a['address']})
return JsonResponse(area_list, safe = False)
2.3 前端template
前端主要是顯示和執(zhí)行操作相應(yīng),具體實(shí)現(xiàn)是通過下拉框值的改變觸動相應(yīng)函數(shù)。這里只寫關(guān)鍵的地方。
address.html 文件
<body>
<select id = 'pro'>
<option value=''>請選擇省</option>
</select>
<select id = 'city'>
<option value=''>請選擇市</option>
</select>
<select id = 'dis'>
<option value=''>請選擇縣</option>
</select>
</body>
<script>
address = function(a, b)
{
$.get('/addr/'+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)
// 根據(jù)省查詢市信息
pro.change(function(){
city.empty().append('<option value="">請選擇市</option>');
dis.empty().append('<option value="">請選擇縣</option>');
adress(this.value, city)
})
// 根據(jù)市查詢縣信息
city.change(function(){
dis.empty().append('<option value="">請選擇縣</option>');
adress(this.value, dis)
})
})
</script>
3 效果


以上這篇Django自關(guān)聯(lián)實(shí)現(xiàn)多級聯(lián)動查詢實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python通過Socket手動實(shí)現(xiàn)HTTP協(xié)議
這篇文章主要為大家詳細(xì)介紹了Python如何通過Socket手動實(shí)現(xiàn)HTTP協(xié)議,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一2024-03-03
Python實(shí)現(xiàn)識別圖片為文字的示例代碼
這篇文章主要為大家詳細(xì)介紹了Python如何不調(diào)用三方收費(fèi)接口,照樣實(shí)現(xiàn)識別圖片為文字的功能。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-08-08
Python 3.x 安裝opencv+opencv_contrib的操作方法
下面小編就為大家分享一篇Python 3.x 安裝opencv+opencv_contrib的操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04

