2016-11-15 5 views
1

からセキレイのstreamfieldでブロック値を変更/追加します:は、私は1つのStreamField本体とHeadingBlockという名前のカスタムブロックとのページを持っているシェル

>>> from custom.models import CustomPage 
>>> c = CustomPage.objects.all()[0] 
>>> c.body[0].heading.value = "hello world" ??? this does not work 

誰でも手助けできます。どうもありがとう!

EDIT: 私はListBlockの除去、HeadingBlockを単純化してみました:

>>> c.body[0].value 
StructValue([('heading', u'hi'), ('cssid', u'man')]) 
>>> type(c.body[0].value) 
<class 'wagtail.wagtailcore.blocks.struct_block.StructValue'> 
>>> from wagtail.wagtailcore.blocks.struct_block import StructValue 
>>> c.body[0].value = StructValue([('heading', u'hello'), ('cssid', u'world')]) 
>>> c.save() 

をしかし、私は、管理インターフェイスに行くとき、フィールドは空です。

>>> c.body[0].block.child_blocks 
OrderedDict([('heading', <wagtail.wagtailcore.blocks.field_block.CharBlock object at 0x7f4c2aaf9790>), ('cssid', <wagtail.wagtailcore.blocks.field_block.CharBlock object at 0x7f4c2aaf9a90>)]) 
>>> c.body[0].block.child_blocks['heading'] 
<wagtail.wagtailcore.blocks.field_block.CharBlock object at 0x7f4c2aaf9790> 
>>> c.body[0].block.child_blocks['heading'].value 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'CharBlock' object has no attribute 'value' 

何も、起こらない私は、これはそれほど難しいことだとは思わない: は、私が試しました - |

+0

オブジェクトを保存していますか?最後に 'c.save()'を試してください – kristian

+0

私は質問 –

答えて

3

StructValue([('heading', u'hi'), ('cssid', u'man')])出力が少し誤解を招く - 独自のStructValueを構築するには、対応するStructBlockオブジェクトを渡す必要があります。 StreamFieldの値は、c.body[0].valueのように(現時点ではmay change in a future Wagtail releaseですが) 'インプレース'に更新されるようには設計されていないという別の問題があります。

StreamFieldを更新するには、(block_type、value)タプルのリストからなる新しい値を作成することをお勧めします。あなたがこのアプローチを使用すると、StreamFieldは正しい型に値を変換するの世話をする - StructBlockのために、あなたは、単に、むしろあなた自身のStructValueを構築するよりも、辞書に渡すことができるように:

c.body = [ 
    ('heading', {'heading': 'hi', 'cssid': 'man'}) 
] 

内の既存のデータがある場合あなたが保持したいフィールドであれば、より完全なコードスニペットは次のようになります。

new_body = [] 
for block_type, value in c.body: 
    if block_type == 'heading': 
     new_body.append(
      ('heading', {'heading': 'hello world', 'cssid': value['cssid']}) 
     ) 
    else: 
     new_body.append((block_type, value)) 

c.body = new_body 
+0

を簡略化しようとしました、それは動作します! –

関連する問題