2016-11-15 55 views
1

/修改鶺鴒streamfield塊值我有一個StreamField體頁面和一個自定義模塊命名HeadingBlock:附加從外殼

class HeadingBlock(blocks.StructBlock): 
    heading = blocks.CharBlock() 
    cssid = blocks.CharBlock() 
    ... 

class CustomPage(Page): 
    ... 
    body = StreamField([ 
     ('heading', HeadingBlock()), 
    ... 

我需要新的charblock添加標題HeadingBlock的屬性,而是使用shell :

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

任何人都可以幫忙嗎?非常感謝!

編輯: 我簡化了HeadingBlock,消除ListBlock和嘗試:

>>> 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,值)元組的列表組成。當您使用此方法,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

謝謝,它的工作原理! –