Добавление StructBlock Wagtail в StreamfieldPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Добавление StructBlock Wagtail в Streamfield

Сообщение Anonymous »

Есть ли хороший способ добавить StructBlock в существующий StreamField? Я создаю страницу ссылок, на которой пользователи, не являющиеся администраторами, могут добавлять свои собственные ссылки. Я хотел бы иметь возможность добавлять LinkBlock, используя данные формы. Я прикрепляю то, что у меня есть прямо сейчас, и сейчас изучаю исходный код Wagtail, чтобы лучше понять, как создаются блоки.

Код: Выделить всё

class LinkBlock(blocks.StructBlock):
title = blocks.CharBlock(required=True, help_text="Link title")
url = blocks.URLBlock(
required=True,
help_text="Link URL",
)

class LinksPage(Page):
links = StreamField(
[
("link", LinkBlock()),
],
blank=True,
use_json_field=True,
max_length=20
)

content_panels = Page.content_panels + [
FieldPanel("links"),
]

# Adding dynamic links with form data
links_page.links.append(
(
"link",
{
"title": form.cleaned_data["title"],
"url": form.cleaned_data["url"],
"link_type": form.cleaned_data["link_type"],
"color_scheme": form.cleaned_data["color_scheme"],
},
)
)

try:
# TODO: Investigate why this is necessary
# links_page.links._raw_data = [lnk for lnk in links_page.links._raw_data if lnk is not None]
# without the filter above, we get a TypeError when trying to save the page
links_page.save()
except TypeError as e:
logger.error(f"Error saving link: {e}")
raise e

"""
Example stack trace:

File "../.venv/lib/python3.13/site-packages/wagtail/blocks/stream_block.py", line 680, in __getitem__
self._prefetch_blocks(raw_value["type"])
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
File "../.venv/lib/python3.13/site-packages/wagtail/blocks/stream_block.py", line 710, in _prefetch_blocks
raw_values = OrderedDict(

File "../.venv/lib/python3.13/site-packages/wagtail/blocks/stream_block.py", line 713, in 
if raw_item["type"] == type_name and self._bound_blocks[i] is None
~~~~~~~~^^^^^^^^
TypeError: 'NoneType' object is not subscriptable
"""
После того, как вы повозились, похоже, что этот метод работает для добавления StructBlock:

Код: Выделить всё

links = [(lnk.block_type, lnk.value) for lnk in links_page.links]
links.append(
(
"link",
{
"title": form.cleaned_data["title"],
"url": form.cleaned_data["url"],
"link_type": form.cleaned_data["link_type"],
"color_scheme": form.cleaned_data["color_scheme"],
},
)
)
links_page.links = links
Однако документы Wagtail, похоже, указывают на то, что простое добавление с кортежем (тип блока, данные) должно работать. Был бы признателен за понимание.

Подробнее здесь: https://stackoverflow.com/questions/793 ... treamfield
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Добавление StructBlock Wagtail в Streamfield
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Python Wagtail аварийно завершает работу 6.5.1 «Объект Streamfield не имеет атрибута 'bind_to_model'
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Python Wagtail аварийно завершает работу 6.3.1 «Объект Streamfield не имеет атрибута 'bind_to_model'
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Python Wagtail аварийно завершает работу 6.3.1 «Объект Streamfield не имеет атрибута 'bind_to_model'
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Python Wagtail аварийно завершает работу 6.3.1 «Объект Streamfield не имеет атрибута 'bind_to_model'
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»