0

我想建立这个层次结构:

      <ul id="red" class="treeview-red">
          <li><span>Item 1</span>
            <ul>
              <li><span>Item 1.0</span>
                <ul>
                  <li><span>Item 1.0.0</span></li>
                </ul>
              </li>
              <li><span>Item 1.1</span></li>
            </ul>
          </li>
          <li><span>Item 2</span>
            <ul>
              <li><span>Item 2.0</span>
                <ul>
                  <li><span>Item 2.0.0</span>
                  <ul>
                    <li><span>Item 2.0.0.0</span></li>
                    <li><span>Item 2.0.0.1</span></li>
                  </ul>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li class="open"><span>Item 3</span>
            <ul>
              <li class="open"><span>Item 3.0</span>
                <ul>
                  <li><span>Item 3.0.0</span></li>
                  <li><span>Item 3.0.1</span>
                  <ul>
                    <li><span>Item 3.0.1.0</span></li>
                    <li><span>Item 3.0.1.1</span></li>
                  </ul>

                </li>
                  <li><span>Item 3.0.2</span>
                  <ul>
                    <li><span>Item 3.0.2.0</span></li>
                    <li><span>Item 3.0.2.1</span></li>
                    <li><span>Item 3.0.2.2</span></li>
                  </ul>
                </li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>

使用此模型:

class Category(models.Model):
    parent=models.ForeignKey('self',null=True,blank=True)
    name=models.CharField(max_length=100)

在 views.py 中,我编写了这个简单的代码来获取类别:

def getCats(request):
    cats=Category.objects.all()
    str=u''
    str+='<li><span>Item 1</span><ul>'
    for cat in cats:
        str+=hiararchy(cat)
    str+=u'</ul></li>'
    return HttpResponse(simplejson.dumps(str),mimetype='application/json')

def hiararchy(cat):
    s=''
    if cat.parent is None or cat.parent==cat:
        s=cat.name
    else:
        s=cat.name
        return hiararchy(cat.parent)
    return s

我不知道如何使用这种格式获取类别,坦率地说,我不太擅长递归函数。

4

2 回答 2

1

也许你会发现这篇文章很有用:我用递归问了一个类似的问题,看起来有点像你的

Python通过对象和子对象递归,打印子深度数

于 2012-06-28T13:34:00.407 回答
0

最后我想出了这个解决方案:

def getCats(request):
    cats=Category.objects.filter(parent=None)
    s=u'<ul id="red" class="treeview-red">'
    for cat in cats:
        s += hiararchy(cat,True)
    s+=u'</ul>'
    return HttpResponse(simplejson.dumps(s),mimetype='application/json')

def hiararchy(cat,flag):
    if cat.parent and flag:
        return hiararchy(cat.parent,True)
    else:
        if cat.children.count()>0:
            s=u'<li><a href="#" id="'+str(cat.pk)+'" class="cat">%s</a>'%(cat.name)
            for child in cat.children.all():
                s+=u'<ul>%s</li></ul></li>'%(hiararchy(child,False))
            return s
        else:
            return u'<li><a href="#" id="'+str(cat.pk)+'" class="cat">%s</a></li>'%(cat.name) 

注意:1)当一个类别没有父节点时,这意味着它是树中的根节点 2)我的示例中的编号没有在我的代码中实现,我需要替换类别的名称来代替这些数字

于 2012-06-30T18:40:48.713 回答