API виджетов формы со стороны клиента
Для того, чтобы интерфейс редактирования StreamField динамически создавал поля формы, все виджеты Django формы, используемые внутри блоков StreamField, должны иметь соответствующую реализацию на JavaScript, определяющую, как виджет отображается на стороне клиента и заполняется данными, а также как извлечь данные из этого поля. Wagtail предоставляет эту реализацию для виджетов, наследуемых от django.forms.widgets.Input, django.forms.Textarea, django.forms.Select и django.forms.RadioSelect. Для других типов виджетов или тех, которые требуют пользовательского поведения на стороне клиента, вам нужно предоставить собственную реализацию.
Библиотека telepath используется для создания отображения между классами виджетов Python и их соответствующими реализациями на JavaScript. Для создания отображения определите подкласс wagtail.widget_adapters.WidgetAdapter и зарегистрируйте его в wagtail.telepath.register.
from wagtail.telepath import register
from wagtail.widget_adapters import WidgetAdapter
class FancyInputAdapter(WidgetAdapter):
# Identifier matching the one registered on the client side
js_constructor = 'myapp.widgets.FancyInput'
# Arguments passed to the client-side object
def js_args(self, widget):
return [
# Arguments typically include the widget's HTML representation
# and label ID rendered with __NAME__ and __ID__ placeholders,
# for use in the client-side render() method
widget.render('__NAME__', None, attrs={'id': '__ID__'}),
widget.id_for_label('__ID__'),
widget.extra_options,
]
class Media:
# JS / CSS includes required in addition to the widget's own media;
# generally this will include the client-side adapter definition
js = ['myapp/js/fancy-input-adapter.js']
register(FancyInputAdapter(), FancyInput)
Объект JavaScript, связанный с экземпляром виджета, должен предоставлять один метод:
Состояние виджета часто совпадает со значением поля формы, но может содержать дополнительные данные, которые не обрабатываются при отправке формы. Например, виджет выбора страницы состоит из скрытого поля формы, содержащего идентификатор страницы, и только для чтения метки, отображающей заголовок страницы: в этом случае только идентификатор страницы не предоставляет достаточной информации для отображения виджета, и поэтому состояние определяется как словарь со значениями id и title.
Значение, возвращаемое render — это объект «связанного виджета», позволяющий получить доступ к данным данного экземпляра виджета. Этот объект должен реализовывать следующие атрибуты и методы:
© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v3.0.3/reference/streamfield/widget_api.html