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 に答える