Добавление объекта к структурному блоку внутри 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)
Вернуться на верх