在 Django 中基于通用 class 的 DetailView 的模板中使用抽象 class

Using abstract class in template for generic class based DetailView in Django

我刚开始使用基于 class 的通用视图并喜欢它。我确实有一个我仍然无法解决的问题。

我有一个摘要 class 叫做 group,还有两个孩子的 Company 和 Bond。 (我简化了我的例子)。这是我的 models.py:

models.py

class Group(BaseModel):                                                         
    name = models.CharField(max_length=30, unique=True)                                                

    class Meta:                                                                    
        abstract = True                                                            


class Company(Group):                                                              
    def __str__(self):                                                             
        return "Company " + self.name                                              


class Bond(Group):                                                                 
    def __str__(self):                                                             
        return "Bond " + self.name 

现在,当使用基于通用 class 的详细视图显示我的 object 之一时,我想要一个 group_detail.html 模板,并调用 group.name。但是,这不起作用,我需要调用 company.name 或 bond.name,具体取决于 object 类型。由于我的原始模型具有更多属性,因此这是不可取的,因为它会导致大量重复代码。你们知道解决方法吗?

Group 在数据库中没有实例,因为它是一个抽象 class,因此您无法查询它。您必须查询 CompanyBond,因此将 CompanyBond 对象传递给模板。

如果您的 CompanyBond 模型具有相同的属性,您可以将它们的对象传递给具有单个上下文名称的模板,这样您就可以使用一个模板。但是,实际上,我认为你的 CompanyBond 模型是不同的,所以你不能为它们创建一个模板,它们会不同,所以根本没有代码重复。

只需为两个视图使用相同的模板,并使用自动传递给上下文的 object 变量,例如 {{ object.name }}.