Добавление объекта к структурному блоку внутри StreamField Wagtail
Пытаюсь создать новую задачу динамически в моем проекте на wagtail, используя StreamField и StructBlock, но безуспешно.
Пожалуйста, помогите, я схожу с ума от этого. Пользователь задает некоторые параметры в шаблоне, а затем должен создать новую задачу...
Я попробовал три разных варианта, но получилось вот это. Я пробовал с 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)