在Django模板中使用abc.ABC类对象:为什么Django试图实例化它?

时间:2015-11-09 01:03:05

标签: python django django-templates abc

我想在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。

1 个答案:

答案 0 :(得分: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 documentation