【问题标题】:How can I create Page and set its StreamField value programmatically?如何以编程方式创建 Page 并设置其 StreamField 值?
【发布时间】:2017-12-13 07:57:17
【问题描述】:

我想以编程方式在 wagtail 中创建一个 BlogPage,并设置它的 StreamField 值。我可以设置heading 字段。但是当我尝试设置paragraph 字段时,我得到了AttributeError: 'unicode' object has no attribute 'source'。我也想设置图片。

这是我的 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'),
]

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

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()

【问题讨论】:

    标签: python django wagtail


    【解决方案1】:

    起初,我使用 Wagtail 管理界面创建了一个 BlogPage,并手动将其设置为 StreamField(heading etc.)。我在 python shell 中使用__dict__ 检查了新创建的BlogPage 对象的属性。然后我在过滤body StreamFieldPanel 后得到了这些结果 'stream_data': [{u'type': u'heading', u'id': u'0ebe1070-d167-48a0-9c57-70e4ad068ae5', u'value': u'New Heading'}]。 在看到 stream_data 的结构并从 LB Ben Johnston 的回答中获得使用 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'},
           ])
    )
    

    【讨论】:

    • 我已经尝试过了,但它显示了这个错误。 AttributeError:“str”对象没有属性“get_prep_value”
    • @Md. Showkat Hossain Chy 如果您接受 LB Ben Jonsohn 的回答来帮助您解决问题,而不是自己添加答案,那将是一个很好的姿态。
    【解决方案2】:

    以编程方式添加StreamField 的数据时,最好将数据作为原始json 字符串输入。数据将是一个字典数组,其中每个字典包含一个type 和一个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>'},
        ])
    )
    

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

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

    【讨论】:

    • 感谢您的回复。现在,它给出了这个错误{'type':'paragraph', 'value': '&lt;strong&gt;My Paragraph&lt;/strong&gt;'}, TypeError: 'function' object has no attribute '__getitem__'
    • 仔细检查传递给 json.dumps 的完整数组,我修正了我的答案,但它在某些 dicts 的键中有一些拼写错误。也许还可以先在 Python shell 中测试您的 json.dumps[...] 以确保其格式正确。
    • 它对我不起作用。当我将其更改为 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'}, ]) 时,它就起作用了。
    猜你喜欢
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多