首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设计层次(树)表以显示下拉菜单?

如何设计层次(树)表以显示下拉菜单?
EN

Stack Overflow用户
提问于 2016-01-29 06:14:35
回答 1查看 437关注 0票数 0

我有我的表名Layer

它有4个字段:layer1,layer2,layer3,layer4

模型

代码语言:javascript
复制
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层。

例如:

代码语言:javascript
复制
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。

代码语言:javascript
复制
layer1 = Layer(Q~(layer1=''),layer2='',layer3='',layer4='') 

如果他选择city A,那么

代码语言:javascript
复制
layer2 = Layer(layer1='city A',Q(layer2=''),layer3='',layer4='') 

如果他选择Building A,那么

代码语言:javascript
复制
layer3 = layer2.filter(layer2='Building A',Q(layer3=''),layer4='')  

诸若此类

但这似乎并不有效。我想问问方向,怎么做才好呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-01 08:14:52

对树模型的详细解释是这里

我将要使用的imanigary模型

代码语言:javascript
复制
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列:

代码语言:javascript
复制
id | parent_id | layer

第一层必须使parent_id字段为空。

代码语言:javascript
复制
id | parent_id | layer
1  |           | city A

在第二层,您必须将"Building“分配给父级,即"City A”,并且它有#1 ID。

代码语言:javascript
复制
id | parent_id | layer
2  | 1         | building A

在第三层和第四层是相同的设置。

代码语言:javascript
复制
id | parent_id | layer
3  | 2         | 12 F
4  | 3         | department A

(如果某些层可能是空的,那么将CharField更改为null=True。)

如果你往上面看,你可能会明白它为什么叫树。如果您想象它看起来如下:(我添加了更多的行)

代码语言:javascript
复制
city A
    building A
        12 F
            department A
    building B
        1 F
            department B
city B
    building A
        2 F
            department A

为了在“终端”中显示,必须(左)加入一个查询,我希望您能够这样做(有这么多的声誉点)。

代码语言:javascript
复制
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,例如“子”。

最后,以简短的方式设置:

  • 首先,只在第一层的第一选择框中的客户端显示,其他将被禁用。
  • 在选择了第1层之后,发送一个AJAX来显示子数据,在发送的数据中将是父ID。
  • 在视图中,您将从发送的数据中获得父id和结果查询,将其发回,显示在第二层的复选框中,并允许它(取消禁用状态)。
  • 对于#3和#4层,与前面的步骤相同。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35078028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档