私はもともとこの質問をワグテールの問題キューで尋ねましたが、それは間違った場所だったと思います. (これはドキュメントのバグだと思いますが。)
とにかく、私の問題は、内部でStructBlock
a を使用するカスタム クラスがあることです。フォームが自分の初期化子と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
のイニシャライザが実行されなかったため、そのボタンはどれも機能しませんでした。
鶺鴒の問題キューで、次のようなことを試すように勧められました。
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
どのように最も曖昧な手がかりがありません。