2017-01-08 2 views
1

Ich habe eine abstrakte Klasse, die ha StreamField drin haben. Ich habe auch eine Klasse CustomPage, die von BasePage erbt. Ich möchte, dass CustomPage dem Inhalt einen neuen StructBlock hinzufügt. Wie mache ich das?Erweitern Wagtail Streamfields in einer geerbten Klasse

class BasePage(Page): 
    content = StreamField([ 
     ('ad', ...), 
     ('text', ...), 
     ('img', ...), 
    ]) 
    content_panels = Page.content_panels + [ 
     StreamFieldPanel('content'), 
    ] 

    class Meta: 
     abstract = True 

class CustomPage(BasePage): 
    # add ('custom_block', ...) to content streamfield. 

Antwort

2

Die StreamField Definition kann nicht auf diese Weise ‚erweiterte‘ direkt, aber mit ein bisschen Wieder schlurfen Sie können einen neuen StreamField definieren, die erneut verwendet die gleiche Blockliste:

COMMON_BLOCKS = [ 
    ('ad', ...), 
    ('text', ...), 
    ('img', ...), 
] 

class BasePage(Page): 
    content = StreamField(COMMON_BLOCKS) 
    ... 

class CustomPage(BasePage): 
    content = StreamField(COMMON_BLOCKS + [ 
     ('custom_block', ...), 
    ]) 

oder mit Vererbung auf StreamBlock (die man ein wenig sauberer als verketten Listen betrachten könnte:

class CommonStreamBlock(StreamBlock): 
    ad = ... 
    text = ... 
    img = ... 

class CustomStreamBlock(CommonStreamBlock): 
    custom_block = ... 

class BasePage(Page): 
    content = StreamField(CommonStreamBlock()) 
    ... 

class CustomPage(BasePage): 
    content = StreamField(CustomStreamBlock()) 

beachten Sie auch, dass dies only possible since Django 1.10 - ältere Versionen von Django nicht Überschreiben Sie Felder einer abstrakten Oberklasse.

0

Ich fand eine weitere Lösung neben @gasman Lösungen.

Sie verwendet die deconstruct-Methode im Stream-Feld, um alle Blöcke von BasePage StreamField abzurufen. Es verwendet diese Blöcke beim Erstellen des Inhalts StreamField in der CustomPage.

Ich werde dieses für jetzt verwenden, aber ich denke @gasman letzte Lösung ist die schönste Lösung.

class BasePage(Page): 
    content = StreamField([ 
     ('ad', ...), 
     ('text', ...), 
     ('img', ...), 
    ]) 
    content_panels = Page.content_panels + [ 
     StreamFieldPanel('content'), 
    ] 
    @staticmethod 
    def get_content_blocks(): 
     return list(BasePage.content.field.deconstruct()[2][0]) 

    class Meta: 
     abstract = True 

class CustomPage(BasePage): 
    content = StreamField(BasePage.get_content_blocks() + 
     [ 
      ('custom_block', ....), 
     ] 
    ) 
Verwandte Themen