我即将重新设计一个用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'应用程序 已经解决了这个然而,存在一些差异。
答案 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。