我最初在 wagtail 问题队列上问了这个问题,我想这是错误的地方。(虽然我确实认为这是文档中的一个错误。)
无论如何,我的问题是我有一个在StructBlock
其中使用的自定义类ListBlock
。我需要js_initializer()
在我的自定义类上定义一个方法,该方法会导致表单同时触发我自己的初始化程序和 ListBlock
的初始化程序。
我最初的尝试,基于docs,看起来像这样:
# my_blocks.py
class ImageGalleryBlock(blocks.StructBlock):
images = ListBlock(ImageChooserBlock(label='Image'))
def js_initializer(self):
return "ImageGallery"
@property
def media(self):
return forms.Media(
js=['app/js/admin/image-gallery.js']
)
# image-gallery.js
function ImageGallery(prefix) {
// Set up the Image Gallery block's custom form behavior...
}
这使ImageGallery()
函数运行,但没有运行ListBlock
的初始化程序,所以它的按钮都不起作用。
在 wagtail 问题队列中,建议我尝试这样的事情:
def js_initializer(self):
initializer_js = super(HeadingBlock, self).js_initializer()
my_custom_js = 'ImageGallery("%s")' % self.definition_prefix
if initializer_js:
# child blocks have custom JS initializers and need to be used
return '%s,\n%s' % (initializer_js, my_custom_js)
return my_custom_js
# image-gallery.js
function ImageGallery(prefix) {
var init_image_gallery = function(element_prefix) {
// Do stuff...
};
return init_image_gallery;
}
我必须对最初的建议进行一些改进才能使该ImageGallery()
部件发挥作用,但它仍然没有运行ListBlock
初始化程序。
以下是为其生成的初始化程序代码的ImageGalleryBlock
样子:
{
'name': ('ImageGalleryBlock'),
'initializer': (StructBlock({
'images': (ListBlock({
'definitionPrefix': ('blockdef-63')
}))
}),
ImageGallery("blockdef-91"))
},
我觉得我真正需要做的是为正在传递的 dict 添加另一个键StructBlock
,但我没有最模糊的线索。