Wagtail从现场创建自定义StreamField块?

问题描述 投票:1回答:1

我在MarkdownField教程之后创建了自定义MarkdownPanelthis类:

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"


他们的工作非常好:

custom markdown field working well

我的目标是能够在页面模型上的StreamField中创建自定义块以使用它,如下所示:

class TestPage(Page):
    body = StreamField([
        ('markdown', MarkdownBlock()),
    ])

    content_panels = Page.content_panels + [
        StreamFieldPanel('body')
    ]

    api_fields = [
        APIField('body')
    ]

所以我试图根据Wagtail docs创建一个自定义的Block类:

... (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类进行通信。我只看到了使用现有块组合而不是自定义字段的自定义块的示例。任何有助于将我的降价字段变成块的帮助将不胜感激!

python django field block wagtail
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.