0

sitesフレームワークを利用し、それぞれのホームページとして単一のページを持つセキレイプロジェクトがありますsite。これらのホームページには (必然的に) 子ページは必要ありません。それらのコンテンツは、さまざまな streamfield から構築されていStructBlockます。

これらStructBlockの のそれぞれには、個別のフィールド セットがありますが、共通のフィールドもあります (例: show_in_navigation)。

show_in_navigation BooleanBlockfor eachを繰り返さないようにするために、共通フィールドを使用してStructBlockを作成し、これを特定のブロック用にサブクラス化しました。BaseStructBlock

# models.py
class Homepage(Page):
    body = StreamField(
        BaseStreamBlock(),
    )

content_panels = Page.content_panels + [
    StreamFieldPanel('body'),
]

# blocks.py
class BaseStructBlock(StructBlock):
    show_in_navigation = BooleanBlock()

class BaseStructBlock(StructBlock):
    show_in_navigation = BooleanBlock()

    def get_form_context(self, value, prefix='', errors=None):
        context = super(BaseStructBlock, self).get_form_context(
            value, prefix=prefix, errors=errors
        )
        # reverse order of fields in OrderedDict, so that the fields from
        # BaseStructBlock appear after the specific fields
        context['children'] = collections.OrderedDict(
            reversed(list(context['children'].items()))
        )
        return context

    class Meta:
        abstract = True

class FooBlock(BaseStructBlock):
    # field definitions

class BarBlock(BaseStructBlock):
    # field definitions

class BaseStreamBlock(StreamBlock):
    foo_block = FooBlock()
    bar_block = BarBlock()

それは機能します-show_in_navigation継承するすべてのブロックで取得しますBaseStructBlock-しかし、これらのフィールドの編集インターフェイスをカスタマイズしたいと思います:

  • 現時点ではBaseStructBlock、サブクラス化されたブロックのフィールドの上にすべてのフィールドが表示されます -特定のフィールドの下に表示したい- 解決済み、更新を参照してくださいBaseStructBlock
  • これらのクールなパネルのカスタマイズをすべて使用してedit_handlers、すべての共通フィールドを作成できれば幸いcollapsibleです。

これは可能ですか?すべてのヒントは大歓迎です。

PS: ドキュメント セクション の StructBlockのカスタム編集インターフェイスに気付きましたが、これが私のニーズをどのように解決できるかわかりません...

PPS: このプロジェクト:

  • ジャンゴ (2.0.1)
  • セキレイ (2.0b1)
4

0 に答える 0