1

私の鶺鴒 Web サイト プロジェクトはcoreeventpublicationsなどのさまざまなアプリに分割されており、 にストリームフィールドを設定していcore.modelsます。

core.modelsこのストリームフィールドを だけでなく にも再利用したいと思いevent.modelsます。

しかし、ストリームフィールドを 1 回だけ定義 (サブクラス化StreamBlock) し、すべてのアプリで再利用する最もエレガントな (ドライな) 方法は何ですか?

StreamBlockwagtaildemoプロジェクトのものに触発されました:

# core/models.py
class StoryBlock(StreamBlock):
    h2 = CharBlock(icon="title", classname="title")
    h3 = CharBlock(icon="title", classname="title")
    h4 = CharBlock(icon="title", classname="title")
    intro = RichTextBlock(icon="pilcrow")
    paragraph = RichTextBlock(icon="pilcrow")
    aligned_image = ImageBlock(label="Aligned image")
    pullquote = PullQuoteBlock()
    read_on = ReadOnBlock()

-

# event/models.py
from wagtail.wagtailcore.fields import StreamField
from wagtail.wagtailadmin.edit_handlers import FieldPanel, StreamFieldPanel
from core.models import StoryBlock

class EventIndexPage(Page):
    body = StreamField(StoryBlock())

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

しかしmakemigrations、更新されたEventIndexPageページ モデルを試してみると、私がそうであるという警告が表示されますtrying to add a non-nullable field 'body' to eventindexpage without a defaultが、これは非モデルの (ストリーム) フィールドでのみ発生しcoreます。

要求されたデフォルト値を渡す -"asdf"または"[]"-makemigrations移行ファイルを構築するが、以下migrateは失敗します:

$ python manage.py migrate
...
  File "/myproject/venv/lib/python3.5/site-packages/wagtail/wagtailcore/fields.py", line 90, in get_prep_value
    return json.dumps(self.stream_block.get_prep_value(value), cls=DjangoJSONEncoder)
  File "/myproject/venv/lib/python3.5/site-packages/wagtail/wagtailcore/blocks/stream_block.py", line 205, in get_prep_value
    for child in value  # child is a BoundBlock instance
  File "/myproject/venv/lib/python3.5/site-packages/wagtail/wagtailcore/blocks/stream_block.py", line 205, in <listcomp>
    for child in value  # child is a BoundBlock instance
AttributeError: 'str' object has no attribute 'block'

完全なトレースバック

これが私の問題に関連している場合: このプロジェクトは openshift にデプロイされるため、Python 3 を使用する場合は Django 1.8 に制限されています。

4

1 に答える 1

5

ガスマンがコメントで指摘したように、""移行のデフォルト値として使用するとうまくいきました。

于 2016-06-04T09:54:56.243 に答える