我正在 django 中创建一个简单的 CMS,其中包含多个“模块”(每个模块都作为一个 django 应用程序)。我设置了以下模型:
class FooObject(models.Model):
id = models.SlugField(primary_key=True)
name = models.CharField(max_length=255)
creator = models.ForeignKey(auth.models.User, editable=False, related_name="createdby")
class FooPage(FooObject):
content = models.TextField(blank=True, null=True)
@models.permalink
def get_absolute_url(self):
return ('page', (), {'page_id':self.id}
class FooSubitem(FooObject):
parent = models.ForeignKey(FooPage, related_name='subitems')
在每个模块中,我创建了一个 FooPage 的子类,以及至少一个 FooSubitem 的子类,例如
# in FooBlog.models
class FooBlog(FooPage):
owner = models.ForeignKey(auth.models.User, editable=False)
@models.permalink
def get_absolute_url(self):
return ('blog', (), {'blog_id':self.id})
class FooPost(FooSubitem):
post_time = models.DateTimeField(auto_now_add=True)
和
# in FooGallery.models
class FooGallery(FooPage):
location = models.CharField(max_length=255)
@models.permalink
def get_absolute_url(self):
return ('gallery', (), {'gallery_id':self.id})
class FooImage(FooSubitem):
image_file = models.ImageField(upload_to='foogallery')
这些是简化,但应该让您对我正在尝试做的事情有一个很好的了解。在 FooPost 和 FooImage 的管理员中,我将父选择列表限制为它们相应的父页面。
当我尝试在模板中使用这些时,我的问题就出现了。在每个视图中,我都有以下内容:
page_list = FooPage.objects.all()
它返回所有 FooPages 的列表,包括 FooBlog 和 FooGallery 类型。但是,当我遍历此列表时:
{% for page in page_list %}{{ page.get_absolute_url }}{% endfor %}
它返回 'page' url 模式,而不是 'blog' 或 'gallery' url 模式。
当我想稍后添加 FooCalendar 模块时,如何在不重写代码的情况下完成这项工作?我想确保这适用于任何可能的模块。
谢谢,
- 莱克索