2015-05-04 3 views
1

Я создал 3 абстрактные классы модели: SimpleContent (только сохраняя заголовок, подзаголовок и резюме Все основе текста.) VisualContent (образ, RichText поле) Ctalinkitem (для добавление URL-адреса, может быть страницей, внешним или документом)ParentalKey не связан со всеми подклассами в трясогузки CMS

Я хочу создать еще один класс, который может включать в себя сочетание этих классов, чтобы сформировать класс, подобный модулю.

например. RichContent будет иметь все три из них TextLinkContent будет SimpleContent и Ctalinkitem

Я создал класс, как этот

class RichContent (SimpleContent, VisualContent, Ctalinkitem): 
    class Meta: 
     abstract = True 

Тогда я пытаюсь создать ссылку на страницу

class LandingPageRichContent(Orderable, RichContent): 
    page = ParentalKey('LandingPage', related_name='landingpage_richcontent_link') 

, а затем Я добавляю это на страницу в качестве InlinePanel

LandingPage.content_panels = [ 
    FieldPanel('title',classname='full title'), 
    InlinePanel(LandingPage,'landingpage_richcontent_link', label='Rich Content'),classname='full',heading='Rich Content'), 
] 

Я сделал миграции и никаких ошибок. Однако, когда я пытаюсь создать LandingPage, я мог видеть только поля из SimpleContent. Я не видел ни одного поля ввода для VisualContent и Ctalinkitem.

Если я изменяю declaratioon из RichContent в:

class RichContent (VisualContent, SimpleContent, Ctalinkitem): 

Тогда я могу видеть только поля из VisualContent.

Интересно, правильно ли я делаю правильный подход? Есть ли решение обойти это?

+0

Спасибо @michaelpri. Извините, это мой первый пост, здесь я буду уделять больше внимания в следующий раз. – DSO

ответ

1

Вы должны будете предоставить явное определение panels на RichContent, возможно, что-то вроде:

RichContent.panels = SimpleContent.panels + VisualContent.panels + Ctalinkitem.panels 

трясогузка способен автоматически генерировать определение панели в некоторых случаях, но это весьма ограничено (например, , он не распознает панели выбора страниц) - и, в частности, если у вас уже есть определение panels для каждого из ваших суперклассов, оно автоматически не объединяет их в один список. Вместо этого то, что вы видите здесь, это множественные правила наследования Python, вызывающие атрибут panels от первого суперкласса, чтобы переопределить более поздние.

+0

Он работает! Благодарю вас @ gasman. Я не знал, что панели были переопределены первым суперклассом. Чтобы достичь такой функциональности, пользуюсь ли я правильным подходом? или есть ли другое решение? Я хотел бы иметь некоторую предопределенную панель интерфейса, которая будет включать в себя различную комбинацию классов) – DSO