Трясогузка создать пользовательский блок StreamField из поля? - PullRequest
1 голос
/ 29 марта 2019

Я создал пользовательские 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"


И они действительно хорошо работают как поля:

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 :

... (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 классом.Я видел только примеры пользовательских блоков, которые используют комбинации существующих блоков, а не пользовательских полей.Любая помощь превратить мое поле уценки в блок будет принята с благодарностью!

1 Ответ

1 голос
/ 29 марта 2019

Ваше определение для 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), поэтому использование этого поля не будет работать.

...