Django自关联关系?
我正在尝试创建一个模型页面,这个页面应该能够有“子页面”。
我下面的模型代码在我的Mac(python 2.6.1)和Ubuntu 10.04(python 2.6.5)上一直让Python崩溃:
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)
我哪里做错了?或者这种HTML渲染应该放在视图里吗?
谢谢。
2 个回答
14
关于模型本身,你的思路有点偏了。不要这样想:
children = models.ManyToManyField("self", blank=True)
而是应该这样用:
parent = models.ForeignKey("self", blank=True, related_name="children")
这样做可以让你直接从页面记录中访问子项,并且在数据库中会有更简单的表示。
通常,HTML的渲染应该在视图中进行,而不是在模型里。按照建议使用mptt。
8
我建议你使用 django-mptt
,这个工具可以更简单地处理树形结构的数据。
不过,你得先把 mptt 注册到你的模型里,具体可以参考 这个链接。
下面是我使用这个工具的代码: 在django mptt完整树形列表中包含外键计数?