gpt4 book ai didi

python - Wagtail 从字段创建自定义 StreamField block ?

转载 作者:行者123 更新时间:2023-12-01 08:08:34 34 4
gpt4 key购买 nike

我已经按照 this 创建了自定义 MarkdownFieldMarkdownPanel 类教程:

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

我的目标是能够制作一个自定义 block ,以便在页面模型的 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 类正确通信。我只看到了使用现有 block 组合的自定义 block 的示例,而不是自定义字段的示例。任何将我的 Markdown 字段变成 block 的帮助将不胜感激!

最佳答案

您对 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),因此使用它作为字段将不起作用。

关于python - Wagtail 从字段创建自定义 StreamField block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55412345/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com