将对象附加到 StreamField Wagtail 内的 StructBlock

问题描述 投票:0回答:1

尝试使用 StreamFieldStructBlock 在我的 wagtail 项目中动态创建新任务,但没有成功。

请帮助我,我对此失去了理智。 用户在模板中设置一些参数,然后创建一个新任务...

我尝试了三种不同的选择,但结果是这样。 我有和没有 json.dumps 并将其转换为 StreamField 或 StructBlock 真的快失去理智了😀

这是我的代码:

models.py:

tasks = StreamField([
        ("task", blocks.StructBlock([
            ("name", blocks.CharBlock(required=True, max_length=150)),
            ("description", blocks.RichTextBlock(required=False)),
            ("image", ImageChooserBlock(required=False)),
            ("subtasks", blocks.ListBlock(blocks.StructBlock([
                ("name", blocks.CharBlock(required=True, max_length=150)),
                ("description", blocks.RichTextBlock(required=False)),
            ])))
        ]))
    ],null=True,blank=True,use_json_field=True)
    

浏览次数:

def create_task(request, project_id):
    # create a new task
    project = Project.objects.get(pk=project_id)


    # new_task = {
    #     "name": request.POST["task_name"],
    #     "description": str(request.POST["task_description"]),
    #     "image": None,
    #     "subtasks": [],
    # }
    # project.tasks.append(json.dumps(new_task))
#       \Lib\site-packages\wagtail\blocks\stream_block.py", line 610, in _construct_stream_child     
#     type_name, value = item
#     ^^^^^^^^^^^^^^^^
# ValueError: too many values to unpack (expected 2)
    

    

    # new_task = ('task',{
    #     "name": request.POST["task_name"],
    #     "description": str(request.POST["task_description"]),
    #     "image": None,
    #     "subtasks": [],
    # })
    # project.tasks.append(json.dumps(new_task))
#       \Lib\site-packages\wagtail\blocks\stream_block.py", line 610, in _construct_stream_child     
#     type_name, value = item
#     ^^^^^^^^^^^^^^^^
# ValueError: too many values to unpack (expected 2)



    new_task = {
        'type': 'task', 'value': {
            'type': 'name','value': request.POST['task_description'],
            'type': 'description','value': RichText(request.POST['task_description']),
            'type': 'image','value': None,
            'type': 'subtasks','value': [],
        }
    }
    project.tasks.append(json.dumps(new_task))
#         type_name, value = item
#     ^^^^^^^^^^^^^^^^
# ValueError: too many values to unpack (expected 2)
    
    

    project.save_revision(
        submitted_for_moderation=False,
        approved_go_live_at=None,
        changed=True,
        log_action=True,
        previous_revision=None,
        clean=True,
    ).publish()
    return JsonResponse({"status": "success"})
python django wagtail
1个回答
0
投票

如 StreamField 文档中所述,附加到字段的值应该是

(block_type, value)
的元组。您不需要对其进行 JSON 编码(因为这样您将附加一个字符串,而不是一个元组)。如果您删除
json.dumps
:

,您的第二个版本是正确的
new_task = ('task',{
    "name": request.POST["task_name"],
    "description": str(request.POST["task_description"]),
    "image": None,
    "subtasks": [],
})
project.tasks.append(new_task)
© www.soinside.com 2019 - 2024. All rights reserved.