如何以编程方式创建 Page 并设置其 StreamField 值?

Md.*_*Chy 7 python django wagtail

我想以编程方式创建一个 BlogPagewagtail并设置其 StreamField 值。我可以设置heading字段。AttributeError: 'unicode' object has no attribute 'source'但当我尝试设置字段时,我得到了paragraph。我也想设置一个图像。

这是我的 BlogPage 模型。

models.py

class BlogPage(Page):
template = 'wagtail/test_page.html'
author = models.CharField(max_length=255)
date = models.DateField("Post date")
body = StreamField([
    ('heading', blocks.CharBlock(classname="full title")),
    ('paragraph', blocks.RichTextBlock()),
    ('image', ImageChooserBlock()),
])

content_panels = Page.content_panels + [
    FieldPanel('author'),
    FieldPanel('date'),
    StreamFieldPanel('body'),
]
Run Code Online (Sandbox Code Playgroud)

这是我通过运行此脚本来创建页面的代码。

create_page.py

new_image_page = BlogPage(
    title='Blog',
    slug='michael',
    author='michael',
    date='2017-12-13',
    body=[('heading','New Heading'), ('heading','New Heading 23232'), ('paragraph','My Paragraph')]
)

directory_page = Page.objects.get(slug='home')
directory_page.add_child(instance=new_image_page)
revision = new_image_page.save_revision()
revision.publish()
new_image_page.save()
Run Code Online (Sandbox Code Playgroud)

LB *_*ton 7

以编程方式添加数据时StreamField,最好以原始 json 字符串形式输入数据。数据将是一个字典数组,其中每个字典包含 atype和 a value

这应该可以解决您遇到的任何字符串转换问题。

import json

new_image_page = BlogPage(
    title='Blog',
    slug='michael',
    author='michael',
    date='2017-12-13',
    body=json.dumps([
      {'type':'heading', 'value': 'New Heading'},
      {'type':'heading', 'value': 'New Heading 23232'},
      {'type':'paragraph', 'value': '<strong>My Paragraph</strong>'},
    ])
)
Run Code Online (Sandbox Code Playgroud)

要添加图像,您将执行类似的操作,其中值是图像的 pk (ID)。

{'type': 'image', 'value': my_image.pk},


Md.*_*Chy 2

首先,我使用 Wagtail 管理界面创建了一个 BlogPage,并手动设置StreamField(heading etc.)。我在 python shell 中检查了新创建的BlogPage对象的属性。__dict__然后我在过滤bodyStreamFieldPanel 后得到了这些结果'stream_data': [{u'type': u'heading', u'id': u'0ebe1070-d167-48a0-9c57-70e4ad068ae5', u'value': u'New Heading'}]。在看到 LB Ben Johnston 的答案的结构stream_data并获得使用建议后json.dumps(),我得到了我的解决方案。

这是我的解决方案。

import json

new_image_page = BlogPage(
   title='Blog',
   slug='michael',
   author='michael',
   date='2017-12-13',
   body = json.dumps([
       {u'type': u'heading', u'value': u'New Heading 23232'},
       {u'type': u'heading', u'value': u'New Heading 23232'},
       {u'type': u'paragraph', u'value': u'New Paragraph'},
       ])
)
Run Code Online (Sandbox Code Playgroud)

  • @马里兰州。Showkat Hossain Chy 如果您接受 LB Ben Jonsohn 帮助您解决问题的答案,而不是自己添加答案,那将是一个很好的姿态。 (2认同)