Django自我指涉关系?

6 python django django-models

我正在尝试创建模型页面,页面也应该能够有"子页面".

我的下面的模型代码一直在我的Mac(python 2.6.1)和Ubuntu 10.04(python 2.6.5)上崩溃:

from django.db import models
from django.contrib import admin

class Page(models.Model):
    slug = models.SlugField(blank=True)
    title = models.CharField(max_length=100)
    content = models.TextField(blank=True)
    children = models.ManyToManyField("self", blank=True)
    published = models.BooleanField(default=True)
    created = models.DateTimeField(blank=True, auto_now_add=True)

    def html(self):
        html = "<li>"
        html += self.title

        children = self.children.all()
        if len(children) > 0:

            for page in children:
                html += page.html()

        html += "</li>"
        return html

    def __unicode__(self):
        return self.title


class PageAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('title',)}


admin.site.register(Page, PageAdmin)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?或者这种HTML渲染是否属于视图?

谢谢.

Jor*_*ter 13

就模型本身而言,你只是在错误的方向上思考这个问题.代替

children = models.ManyToManyField("self", blank=True)
Run Code Online (Sandbox Code Playgroud)

使用

parent = models.ForeignKey("self", blank=True, related_name="children")
Run Code Online (Sandbox Code Playgroud)

这将允许您直接从页面记录访问子项,但应该是数据库中更直接的表示.

HTML呈现通常应该在视图中进行,而不是在模型中进行.使用mptt作为meder建议.


med*_*iev 8

我建议你使用django-mptt哪种提供更容易使用的递归吐出结构的方法,例如@ http://django-mptt.github.com/django-mptt/templates.html

但是,您必须首先向模型注册mptt .

这是我的代码使用它:在django mptt完整树列表中包括外键计数?