首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django继承和Permalinks

Django继承和Permalinks
EN

Stack Overflow用户
提问于 2010-07-05 00:48:07
回答 3查看 1.1K关注 0票数 2

我正在django中创建一个简单的CMS,包含多个“模块”(每个模块都是django应用程序)。我建立了以下模型:

代码语言:javascript
复制
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的子类。

代码语言:javascript
复制
# 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)

代码语言:javascript
复制
# 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的管理员中,我将父选择列表限制在相应的父页面上。

当我试图在模板中使用这些内容时,我的问题就出现了。在每一种观点中,我有以下几点:

代码语言:javascript
复制
page_list = FooPage.objects.all()

它返回所有FooPages ( FooBlog和FooGallery类型)的列表。但是,当我遍历这个列表时:

代码语言:javascript
复制
{% for page in page_list %}{{ page.get_absolute_url }}{% endfor %}

它返回‘页面’url模式,而不是‘博客’或‘图库’url模式。

当我以后要添加一个FooCalendar模块时,我如何使这个工作不需要重写代码呢?我想确保这与任何可能的模块一起工作。

谢谢,

  • 雷克萨斯
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-06 05:52:07

这个问题的经典解决方案往往是向超类添加一个ContentType,该类存储该实例的子类类型。。通过这种方式,您可以依赖于一个一致的API,该API返回相应类型的相关子类对象。

票数 2
EN

Stack Overflow用户

发布于 2013-01-10 22:16:38

通过使用来自InheritanceManager的django-模型-utils,可以避免添加内容类型字段。

然后,如果您在查询集上调用.select_subclasses,它将关闭所有对象,例如:

代码语言:javascript
复制
FooPage.objects.select_subclasses().all()
票数 1
EN

Stack Overflow用户

发布于 2010-07-05 05:05:48

FooPage.objects.all()返回FooPage类型的所有对象,这些对象将混合用于FooPage、FooBlog、FooGallery的基础db表行。要获得正确的URL,您应该得到FooBlog或FooGallery对象。

代码语言:javascript
复制
page.fooblog.get_absolute_url()

如果页面只是通过FooPage创建的页面对象,那么它可能会引发FooPage错误,因此,为了获得正确的urls,您可以这样做

代码语言:javascript
复制
   urls = []
   for page in FooPage.objects.all():
        try:
            page = page.fooblog
        except FooBlog.DoesNotExist:
            pass

            urls.append(page.get_absolute_url())

或者,如果不希望FooPage成为真正的表,则可以尝试将FooPage设置为抽象类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3176731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档