2015-11-09 5 views
1

Я хочу использовать абстрактные объекты класса abc.ABC (а не экземпляр) в шаблоне Django. В этих классах у меня есть несколько методов класса (определенных с помощью декоратора @classmethod), которые я хотел бы использовать для отображения информации.Использование объекта класса abc.ABC в шаблоне Django: почему Django пытается его создать?

Когда я пытаюсь показать объект списка: {{ 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 пытался создать экземпляр объектов класса ... Это нормальное поведение iour? Можно ли использовать объекты класса в шаблоне Django без их создания?

PS: Я использую Django 1.8.5 и Python 3.4.

ответ

2

По умолчанию, если движок шаблона django обнаруживает, что переменная, которую вы используете, является вызываемой, она будет вызывать ее перед доступом к субатрибутам. Это удобно в тех случаях, когда вы хотите получить результаты функции (что django не позволяет вам явно вызвать). Если вы не хотите, чтобы вызываемый вызываемый вызывал в шаблонах django, вы можете установить флаг do_not_call_in_templates на True на свой объект. В вашем случае вы, вероятно, захотите сделать это в своем базовом классе, чтобы каждый подкласс имел и этот атрибут.

TL; DR: Set abc.ABC.do_not_call_in_templates = True

Полная документация о том, как язык шаблонов Django обрабатывает переменные и для получения дополнительной информации о do_not_call_in_templates flag обратитесь к django documentation.