同じクラスへの ForeignKey を持つ Django モデルがあり、効果的にツリーを作成します。
class Tag(models.Model):
name = models.CharField(max_length=50)
parent = models.ForeignKey('self', blank=True, null=True)
Django シェル ( ./manage.py shell
) で再帰をいじってみると、ツリーをプレーン テキストとして簡単に表すことができます。
def nodes(parent, level):
children = Tag.objects.filter(parent=parent)
for c in children:
spaces = ""
for i in xrange(0,level):
spaces+=" "
print "%s%s" % (spaces,c.name)
nodes(c.pk,level+1)
nodes(None,0)
よくわからないのは、ツリー全体を Django テンプレートに入れる方法です。これを簡単にするためにカスタム テンプレート タグを作成しましたが、データをテンプレートに渡してツリーを簡単に反復処理してテンプレートに表示する方法がわかりません。これが基本的なテンプレートタグです。
@register.inclusion_tag("core/tags.html")
def render_tags(**kwargs):
tags = Tag.objects.all()
return {"tags":tags}
上記が非常に基本的なものであることは知っていますが、ここからどこに行くべきかわかりません。Tag クラスに子を取得する関数があればもっと簡単かもしれないと思ったので、クラスにも持っています:
def children(self):
return Tag.objects.filter(parent=self.pk)
私はself.pk
そこで使用します。ツリーのルートは単純ですrootTag=Tag()
。保存されていないためpkがないrootTag.children()
ため、親タグを持たないタグが見つかり、これらのタグのいずれかでchildren()
関数が呼び出され続けることができます. しかし、私が言ったように、これを何らかの単一のデータ構造に変換してテンプレートに渡す方法がわかりません。
考え?私はおそらく一種の辞書を作成したいと思いますが、ここではフォローできません。