簡體   English   中英

如何設計層次結構(樹)表以顯示下拉菜單?

[英]How to design hierarchy (tree) table to display Drop-down menu?

我有表名Layer
其中有4個字段: layer1,layer2,layer3,layer4

該模型

class Layer(models.Model):
    layer1 = models.CharField(max_length=255)
    layer2 = models.CharField(max_length=255)
    layer3 = models.CharField(max_length=255)
    layer4 = models.CharField(max_length=255)

因為它不是標准格式
它可以是city/Building/Floor/departmentcity/Floor/department
這取決於用戶,僅規則至4層

例如:

layer 1 : city A 
layer 2 : Building A
layer 3 : 12 F 

layer 1 : city A 
layer 2 : Building A
layer 3 : 10 F
layer 4 : department A 

layer 1 : city B
layer 2 : 3 F

layer 1 : city B
layer 2 : 3 F
layer 3 : department A 

設置完成后,我們需要在網頁上顯示類似於下拉菜單的菜單,在此處輸入鏈接說明

我現在的想法是先查詢,用戶可以選擇layer1

layer1 = Layer(Q~(layer1=''),layer2='',layer3='',layer4='') 

如果他選擇city A ,那么

layer2 = Layer(layer1='city A',Q(layer2=''),layer3='',layer4='') 

如果他選擇Building A ,那么

layer3 = layer2.filter(layer2='Building A',Q(layer3=''),layer4='')  

等等

但這似乎沒有效果。 我想問問如何做到這一點很好???

這里是樹模型的詳細解釋。

我將使用的原始模型

class NameOfTabel(models.Model):
    """docstrings"""
    parent_id = models.ForeignKey('self', null=True, blank=True)  # For 1.7 v. In 1.9 it's slightly different
    layer = models.CharField(max_length=255)

在開始之前,應該將此模型填充在管理區域中或通過預先填充的腳本填充,因為如果需要的話,很難為每一層設置驗證。

該表有3列:

id | parent_id | layer

第一層必須將parent_id字段為空。

id | parent_id | layer
1  |           | city A

在第二層中,您必須將“建築物A”分配給父級,即“城市A”,並且其ID為#1。

id | parent_id | layer
2  | 1         | building A

在第三和第四層中的設置相同。

id | parent_id | layer
3  | 2         | 12 F
4  | 3         | department A

(如果某些層可能為空,則將CharField更改為null=True 。)

如果從上面看,您可能會明白為什么將其稱為樹。 如果您看到它看起來像這樣:(我添加了更多行)

city A
    building A
        12 F
            department A
    building B
        1 F
            department B
city B
    building A
        2 F
            department A

為了在“終端”中顯示,查詢中必須有(左側)聯接,我希望您可以這樣做(擁有這么多的信譽點)。

layer1 | layer2     | layer3 | layer4
city A | building A | 12 F   | department A
city A | building B | 1 F    | department B
city B | building A | 2 F    | department A

現在,如何在您提供的鏈接中查詢表的用途:

  1. 層= NamOfTable.objects.filter(parent_id__isnull=True)
  2. 層= NameOfTable.objects.filter(parent_id=id_from_ajax_call)
  3. layer =與#2相同
  4. layer =與#2相同

如果仔細看,您會看到一些重復的代碼,因此我建議將表加載到1個變量中,並查詢放置在變量中的#2,#3,#4,例如“ child”。

最后,以簡短的方式進行設置:

  • 首先在客戶端的第一個選擇框中僅顯示第1層,其他將被禁用
  • 選擇第1層后,發送AJAX以顯示子項,並且在發送的數據中將是父項ID
  • 在您將從發送的數據中獲取的視圖中,獲取父ID並查詢結果,將其發送回去,將其顯示在第2層的選擇框中並允許它(取消禁用狀態)
  • #3和#4層的程序與上一點相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM