g从字段创建自定义StreamField块?

时间:2019-03-29 07:22:25

标签: python django field block wagtail

我已按照this教程创建了自定义MarkdownPanelfrom 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" 类:

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

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

    api_fields = [
        APIField('body')
    ]

它们在字段中确实表现良好:

custom markdown field working well

我的目标是能够创建一个自定义块,以在这样的页面模型上的StreamField中使用它:

... (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
        )

因此,我尝试根据Wagtail docs创建一个自定义Block类:

makemigrations

但是在File "*******/cms/home/models.py", line 65, in TestPage ('markdown', MarkdownBlock()), TypeError: __init__() missing 1 required positional argument: 'field_name' 期间遇到了这个错误:

MarkdownField

我知道我在这里做错了什么,但是除了基本示例之外,文档没有太多建议,并且我不确定如何与我的{{1}}类进行适当的交流。我仅看到了使用现有块而不是自定义字段的组合的自定义块的示例。将我的markdown字段变成块的任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您对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包装的是表单字段,而不是模型字段;这里定义的MarkdownField是模型字段(它继承自django.db.models.TextField),因此将其用作该字段将无效。