Как добавить пользовательский js для select в блоке выбора Wagtail

Моя цель состоит в том, чтобы выбор (выпадающие поля) обрабатывался custom-select js библиотекой для блоков в Wagtail Stream Field. Так как это довольно легко добавить для обычных полей при срабатывании события DOMContentLoaded. Но есть ли какой-нибудь event или hook для добавления блока в StreamField?

Я пробовал даже вызывать свою функцию в html-шаблоне для блока. Но, похоже, она вызывается слишком рано, потому что стили не применяются к селектам в этом html.

Это моя .js (машинопись)

const initColorChoosers = () => {
const colorChoosers = Array.from(document.querySelectorAll('.color-chooser select')) as HTMLSelectElement[];
colorChoosers.forEach((chooser) => {
    if (!chooser.hasAttribute('custom')) {
        chooser.setAttribute("custom", "true")
        new CustomSelect(chooser, {
            customOptionClass: 'option--hero-glow-color'
        })
    }
})
}
document.addEventListener("DOMContentLoaded", function (event) {
    window.myfuncs.initColorChoosers = () => initColorChoosers();
});

и мой выбор цвета:

class Colors(blocks.ChoiceBlock):
choices = [
    ('color1', 'color1'),
    ('color2', 'color2'),
    ('color2', 'color2'),
]
required = False,

class Meta:
    form_classname = 'color-chooser'
    icon = 'copy'

и шаблон блока в конце содержит:

<script>
    window.myfuncs.initColorChoosers()
</script>

И это работает... но для уже добавленных блоков, а не для текущего. Так, если я добавлю блок, содержащий ColorChooser, он не будет применять логику из custom-select, но когда я добавлю другой блок, для первого будут применены изменения.

Вам нужно создать BlockAdapter (соответствующий типу блока - если это StructBlock, то StructBlockAdapter) и JavaScript Blockdefinition (опять то же самое, соответствующий типу блока, StructBlock -> StructBlockDefinition.

).

Документация по трясогузке: https://docs.wagtail.org/en/stable/advanced_topics/customisation/streamfield_blocks.html#additional-javascript-on-structblock-forms

Как написать статью: https://enzedonline.com/en/tech-blog/how-to-create-wagtail-streamfield-structblocks-with-a-customised-editor-interface/

Wagtail будет загружать экземпляр BlockDefintion каждый раз, когда вы добавляете этот блок в поле потока.

Вернуться на верх