1

我想在 Django 模板中使用 abc.ABC 抽象类对象(不是实例)。在这些类中,我有几个类方法(使用@classmethod 装饰器定义),我想用它们来显示信息。

当我尝试显示列表对象时:{{ dataset.provided_services }}

我得到一个显示的类对象列表:

[<class 'dataset_services.table_service.QueryTableService'>, <class 'dataset_services.table_service.ExportTableService'>]

但是,如果我尝试遍历此列表:

<ul>
     {% for service in dataset.provided_services %}
     <li>
         <p>{{ service.name }}</p>
         <p>{{ service.description }}</p>
     </li>
     {% endfor %}
 </ul>

我收到一条错误消息,告诉我我无法使用抽象方法实例化抽象基类,就好像 django 试图实例化类对象一样……这是正常行为吗?是否可以在 Django 模板中使用类对象而不实例化它们?

PS:我使用的是 Django 1.8.5 和 Python 3.4。

4

1 回答 1

2

默认情况下,如果 django 模板引擎检测到您正在使用的变量是可调用的,它将在访问子属性之前调用它。如果您想要函数的结果(django 不允许您显式调用),这很方便。如果您不想在 django 模板中调用特定的可调用对象,则可以在对象上设置do_not_call_in_templates标志True。在您的情况下,您可能希望在基类上执行此操作,因此每个子类也具有此属性。

TL;DR:设置abc.ABC.do_not_call_in_templates = True

有关 django 模板语言如何处理变量的完整文档,更多信息do_not_call_in_templates flag请参阅django 文档

于 2016-03-30T17:32:54.103 回答