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