Я столкнулся с каким-то непонятным поведением при работе с «StructBlock» и «ChoiceBlock». По некоторым причинам ChoiceBlock не отображается в меню администратора, если он разработан с помощью нотации классов.
Таким образом, в административном меню не отображается блок выбора. Только текстовый блок.
class CodeBlock(blocks.StructBlock):
code = blocks.TextBlock(required=True)
type = blocks.ChoiceBlock(choices=[
('markup', 'markup'), ('css', 'css')
], required=True),
class Meta:
template = 'home/blocks/code.html'
class HomePageIndex(Page):
body = StreamField([('code', CodeBlock())])
content_panels = Page.content_panels + [
StreamFieldPanel('body'),
]
Следующее решение, на мой взгляд, в значительной степени равнозначно, но работает хорошо. Я не понимаю, почему ... Из-за того, что мне нужно поле Struct-Field чаще, я предпочитаю обозначение класса.
class HomePageIndex(Page):
body = StreamField([
('code', blocks.StructBlock([
('code', blocks.TextBlock(required=True)),
('type', blocks.ChoiceBlock(choices=[
('markup', 'markup'), ('css', 'css')
], template='home/blocks/code.html'))
])
content_panels = Page.content_panels + [
StreamFieldPanel('body'),
Не поймите меня неправильно, я мог бы заставить это работать (используя плохой способ). Интересно, почему это происходит.
Ты заранее
Ty. Это решает мою проблему. Tyvm
Можно ли превратить это в настоящий ответ и принять?
Как уже было сказано, работает хорошо.






У вас есть конечная запятая в конце определения
typeв классеCodeBlock, что означает, чтоtypeсохраняется как кортеж, а не какChoiceBlock. Вот почему он не будет отображаться - потому что трясогузка не распознает его как поле.