编程语言
首页 > 编程语言> > python – Django继承和永久链接

python – Django继承和永久链接

作者:互联网

我在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()

它返回FooBlog和FooGallery类型的所有FooPages的列表.但是,当我遍历此列表时:

{% for page in page_list %}{{ page.get_absolute_url }}{% endfor %}

它返回’page’URL模式,而不是’blog’或’gallery’URL模式.

当我想稍后添加FooCalendar模块时,如何在不重写代码的情况下完成这项工作?我想确保这适用于任何可能的模块.

谢谢,

> Lexo

解决方法:

此问题的经典解决方案往往是adding a ContentType to the superclass which stores the type of subclass for that instance.这样,您可以依赖于返回相应类型的相关子类对象的一致API.

标签:python,django,inheritance,subclass,permalinks
来源: https://codeday.me/bug/20191007/1863742.html