Я создал пользовательские MarkdownField
и MarkdownPanel
классы, следующие за этим учебным пособием:
from django.db.models import TextField
from django.utils.translation import ugettext_lazy as _
from wagtail.admin.edit_handlers import FieldPanel
from wagtail.utils.widgets import WidgetWithScript
from wagtail.core.blocks import FieldBlock
class MarkdownField(TextField):
def __init__(self, **kwargs):
super(MarkdownField, self).__init__(**kwargs)
class MarkdownPanel(FieldPanel):
def __init__(self, field_name, classname="", widget=None, **kwargs):
super(MarkdownPanel, self).__init__(
field_name,
classname=classname,
widget=widget,
**kwargs
)
if self.classname:
if 'markdown' not in self.classname:
self.classname += "markdown"
else:
self.classname = "markdown"
И они действительно хорошо работают как поля:
Моя цель - создать собственный блок для использования в StreamField на модели страницы, например:
class TestPage(Page):
body = StreamField([
('markdown', MarkdownBlock()),
])
content_panels = Page.content_panels + [
StreamFieldPanel('body')
]
api_fields = [
APIField('body')
]
Итак, ямы пытались создать пользовательский класс блоков в соответствии с Wagtail docs :
... (MarkdownField and MarkdownPanel classes defined above)
class MarkdownBlock(FieldBlock):
def __init__(self, field_name, classname="", widget=None, **kwargs):
self.field = MarkdownField()
super(MarkdownPanel, self).__init__(
field_name,
classname=classname,
widget=widget,
**kwargs
)
Но я встречался с этой ошибкой во время makemigrations
:
File "*******/cms/home/models.py", line 65, in TestPage
('markdown', MarkdownBlock()),
TypeError: __init__() missing 1 required positional argument: 'field_name'
Я знаю, что я делаю что-то не так, но в документации нет особых советов, кроме базового примера, и я не уверен, как правильно общаться с моим MarkdownField
классом.Я видел только примеры пользовательских блоков, которые используют комбинации существующих блоков, а не пользовательских полей.Любая помощь превратить мое поле уценки в блок будет принята с благодарностью!