Skip to main content
 首页 » 编程设计

python之Django 继承和永久链接

2024年09月03日28oomusou

我在 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 的管理员中,我将父选择列表限制为它们相应的父页面。

当我尝试在模板中使用这些时,我的问题就出现了。在每个 View 中,我都有以下内容:

page_list = FooPage.objects.all() 

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

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

它返回“页面”URL 模式,而不是“博客”或“画廊”URL 模式。

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

谢谢,

  • 乐索

请您参考如下方法:

这个问题的经典解决方案往往是 adding a ContentType to the superclass which stores the type of subclass for that instance .通过这种方式,您可以依赖一个一致的 API,该 API 返回适当类型的相关子类对象。