Python Wagtail是否从字段创建自定义StreamField块?

Python Wagtail是否从字段创建自定义StreamField块?,python,django,field,block,wagtail,Python,Django,Field,Block,Wagtail,在教程之后,我创建了自定义的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 wa

在教程之后,我创建了自定义的
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')
    ]
因此,我尝试按照以下步骤创建自定义块类:

但是我在
makemigrations
期间遇到了这个错误:

File "*******/cms/home/models.py", line 65, in TestPage
    ('markdown', MarkdownBlock()),
TypeError: __init__() missing 1 required positional argument: 'field_name'


我知道我在这里做错了什么,但是除了一个基本的示例之外,文档中没有太多的建议,我不知道如何正确地与我的
MarkdownField
类通信。我只看到了使用现有块组合的自定义块的示例,而不是自定义字段。任何帮助将我的降价字段转换为块将不胜感激

您对
MarkdownBlock
的定义与文档中的示例不匹配-看起来您已经复制并粘贴了
MarkdownPanel
的定义。正确的类定义如下所示:

class MarkdownBlock(FieldBlock):
    def __init__(self, required=True, help_text=None, **kwargs):
        self.field = MarkdownField(required=required, help_text=help_text)
        super().__init__(**kwargs)

另外,请注意,
FieldBlock
包装表单字段,而不是模型字段<这里定义的code>MarkdownField是一个模型字段(它继承自
django.db.models.TextField
),因此使用它作为字段将不起作用。

感谢您的回复!我现在得到一个错误,说“必需”是意外的super(MarkdownField,self)。\uuuuu init\uuugs(**kwargs)类型错误:\uuuu init\uugs()获取了意外的关键字参数“必需”
class MarkdownBlock(FieldBlock):
    def __init__(self, required=True, help_text=None, **kwargs):
        self.field = MarkdownField(required=required, help_text=help_text)
        super().__init__(**kwargs)