2017-01-08 39 views
1

我有一个抽象类,它有ha个StreamField在里面。我也有一个从BasePage继承的类CustomPage。我想让CustomPage为内容添加一个新的StructBlock。我怎么做?在继承类中扩展w Stream流域

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. 

回答

2

直接以这种方式StreamField定义不能“扩展”,但有一点的重新洗牌,你可以定义一个新的StreamField是重新使用相同的块列表:

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

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

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

或使用StreamBlock(基业你可能会考虑有点整洁比串联列表:

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

class CustomStreamBlock(CommonStreamBlock): 
    custom_block = ... 

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

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

另外,请注意,这是only possible since Django 1.10 - 旧版本的Django的不允许覆盖抽象超类的字段。

0

我在@gasman解决方案旁边找到了更多解决方案。

它使用流场的解构方法得到的BasePage StreamField所有块。它在CustomPage中创建内容StreamField时使用这些块。

我会用这一个,但我认为@gasman最后的解决方案是最漂亮的解决方案。

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', ....), 
     ] 
    )