我正在尝试创建模型页面,页面也应该能够有“子页面”。
我的模型代码在我的Mac(python 2.6.1)和Ubuntu 10.04(python 2.6.5)上保留crashing 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渲染是否属于视图?
感谢。
答案 0 :(得分:13)
就模型本身而言,你只是在错误的方向上思考这个问题。而不是
children = models.ManyToManyField("self", blank=True)
使用
parent = models.ForeignKey("self", blank=True, related_name="children")
这将允许您直接从页面记录访问子项,但应该是数据库中更直接的表示。
HTML渲染通常应该在视图中进行,而不是在模型中进行。使用mptt作为meder建议。
答案 1 :(得分:9)
我建议你使用django-mptt
提供更容易使用的递归吐出结构的方法,例如@ http://django-mptt.github.com/django-mptt/templates.html
但是,您必须使用模型first注册mptt。
以下是我使用它的代码:Including foreign key count in django mptt full tree listing?