如何区分 Django 模板中的继承模型?

Posted

技术标签:

【中文标题】如何区分 Django 模板中的继承模型?【英文标题】:How to distinguish between inherited models in Django templates? 【发布时间】:2011-11-14 23:37:17 【问题描述】:

我有 2 个 Django 模型 - 模型 A 和模型 B。模型 B 继承自模型 A。

class ModelA(models.Model):
    # Fields

class ModelB(ModelA):
    # More fields

我希望能够在模板中以不同方式对待每个模型,如下所示:

% if obj.is_modelA % <-- This is where my problem lies
    Do something
% elif obj.is_modelB % <-- This is where my problem lies
    Do something else
% endif %

我确信我可以一起破解一些东西,但我真的很想知道是否有首选的方法。

提前非常感谢:)

【问题讨论】:

【参考方案1】:

我会说在你的模型中做,而不是像@zeekay 建议的那样在模板中进行比较。这会导致对内部细节的令人不快的依赖(如果您更改了类名,事情就会中断)。

我宁愿这样做:

class ModelA(models.Model):
    is_such_and_such = False

class ModelB(ModelA):
    is_such_and_such = True

它可以通过isinstanceself.__class__.__name__ 的比较作为属性来完成,但我认为定义一个真正的布尔值是一个更好的主意。

最终结果是在您的模板中您可以拥有:

% if obj.is_such_and_such %
    ...
% else %
    ...
% endif %

我也会将其作为基于功能而不是基于模型的事情来做。想想你是如何在 Django 自己的 User 模型上拥有 is_staff 的。它没有在那里使用单独的类,但这个想法适用。确保就您而言,模板中显示的内容对于对后端实现一无所知的人来说是有意义的。

【讨论】:

【参考方案2】:

不确定是否有首选的方法来执行此操作。我可能会将模型的名称添加为属性:

@property
def model_name(self):
    return self.__class__.__name__

【讨论】:

以上是关于如何区分 Django 模板中的继承模型?的主要内容,如果未能解决你的问题,请参考以下文章

django----模板继承

django-模板文件继承

Django 模板继承:如何阻止基础模板重新加载?

Django模板——模板继承

Django模板继承和引用

Django 第六课 模板继承