Есть ли хороший способ добавить 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:
Однако документы Wagtail, похоже, указывают на то, что простое добавление с кортежем (тип блока, данные) должно работать. Был бы признателен за понимание.
Есть ли хороший способ добавить StructBlock в существующий StreamField? Я создаю страницу ссылок, на которой пользователи, не являющиеся администраторами, могут добавлять свои собственные ссылки. Я хотел бы иметь возможность добавлять LinkBlock, используя данные формы. Я прикрепляю то, что у меня есть прямо сейчас, и сейчас изучаю исходный код Wagtail, чтобы лучше понять, как создаются блоки. [code]class LinkBlock(blocks.StructBlock): title = blocks.CharBlock(required=True, help_text="Link title") url = blocks.URLBlock( required=True, help_text="Link URL", )
# 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 """ [/code] После того, как вы повозились, похоже, что этот метод работает для добавления StructBlock: [code]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 [/code] Однако документы Wagtail, похоже, указывают на то, что простое добавление с кортежем (тип блока, данные) должно работать. Был бы признателен за понимание.
Есть ли хороший способ добавить StructBlock в существующий StreamField? Я создаю страницу ссылок, на которой пользователи, не являющиеся администраторами, могут добавлять свои собственные ссылки. Я хотел бы иметь возможность добавлять LinkBlock,...
При обновлении старого веб-сайта Wagtail до текущей версии я столкнулся с этой ошибкой в строке 74 admin/panels/group.py:
AttributeError: 'StreamField' object has no attribute 'bind_to_model'
Поскольку это, очевидно, есть в распространяемом...
(Отредактировано сегодня в 16:00 на основе комментариев, приведенных ниже.)
При обновлении старого веб-сайта Wagtail до текущей версии я столкнулся с этой ошибкой в администраторе. /panels/group.py строка 74:
AttributeError: 'StreamField' object...
(Отредактировано сегодня в 16:00 на основе комментариев, приведенных ниже.)
При обновлении старого веб-сайта Wagtail до текущей версии я столкнулся с этой ошибкой в администраторе. /panels/group.py строка 74:
AttributeError: 'StreamField' object...
(Отредактировано сегодня в 16:00 на основе комментариев, приведенных ниже.)
При обновлении старого веб-сайта Wagtail до текущей версии я столкнулся с этой ошибкой в администраторе. /panels/group.py строка 74:
AttributeError: 'StreamField' object...