Django中CMS(在线杂志)的灵活模型

时间:2009-09-29 08:32:52

标签: django content-management-system

我即将重新设计一个用Plone构建的在线杂志。 而我将在Django中做到这一点。 (原因很简单,我喜欢Django而且我必须维持这个特定的网站(基本上)免费。)

但是我不确定我应该如何设计模型。 基本上,我们的想法是建立一个站点结构 - 在Plone中映射到内部有内容对象的几个文件夹。

这是一个非常简单的布局 - 省略所有不相关的(?)细节。

class Category(models.Model):
    parent = models.ForeignKey('self')
    # stuff like description, slug etc.

class Article(models.Model):
    category = models.ForeignKey(Catgegory)
    # teaser stuff

问题是:

如何扩展,更改或删除此布局,以使此应用的用户能够添加仍可由list_items_in_category视图处理的自定义文章项目。

相关 - 这有点解决问题:

注意

我刚刚意识到这个问题与标记有多相似。优秀的`django-tagging'应用程序 已经解决了这个然而,存在一些差异。

3 个答案:

答案 0 :(得分:2)

您可以简单地使用duck typing - 创建与Article具有相同属性的模型(或至少list_items_in_category及其模板使用的属性)。模型只需要具有Category的外键,您必须以某种方式配置list_items_in_category以查找Category的相关属性。 e.g:

def list_items_in_category(request):
    l = []
    for attr in getattr(settings, 'ITEMS_ON_CATEGORY', ['article_set']):
        l.extend(getattr(Category, attr).all())
    # do something with 'l' in a template.

如果您不想以这种方式限制自定义模型的实际属性,您可以创建包装类,使它们看起来像文章。您只需要为该视图指定被视为文章“接口”的内容。

答案 1 :(得分:1)

这是一种方法:

class Category(models.Model):
    parent = models.ForeignKey('self')
    # stuff like description, slug etc.

class Entry(models.Model):
    category = models.ForeignKey(Catgegory)
    view_method = models.IntegerField(choices = settings.CMS_VIEW_METHODS)
    # teaser stuff

在应用文章中:

class Article(models.Model):
    category = models.OneToOneField(cms.models.Entry)

答案 2 :(得分:1)

顺便说一句,如果您想在Django中制作CMS,可能需要查看Django CMS