尝试使用 StreamField 和 StructBlock 在我的 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"})
如 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)