我终于附上了" onchange" Wagtail ChoiceBlock
的事件处理程序,不使用小部件。
以下是方法。
class CodeChoiceBlock(ChoiceBlock):
def __init__(self, choices=None, default=None, required=True, help_text=None, **kwargs):
super(CodeChoiceBlock, self).__init__(choices=choices,
default=default,
required=required,
help_text=help_text,
**kwargs)
self.field.widget.attrs.update({'onchange': 'update_mode(this)'})
update_mode()
是一种javascript方法,用于在ChoiceBlock
的值更改时更新textarea的模式。
我保留下面的问题
我正在尝试附加一个" onchange" Wagtail的ChoiceBlock的事件处理程序。
目的是更新textarea的codemirror模式。
我创建了一个名为CodeSelectWidget
的小部件,它继承了WidgetWithScript
和widgets.Select
。
我使用以下javascript覆盖render_js_init
方法。
def render_js_init(self, id_, name, value):
jsinit = """
code_choice_{varname!s} = document.getElementById("{id!s}").onchange(function() {{
var code_text_area = document.getElementById("{code_id!s}");
var code_text_editor = window.{code_editor!s};
code_text_area.text();
code_text_editor.setOption(
"mode",
{mode!s}
);
}})
"""
return jsinit.fromat(varname=id_to_var_name(id_),
id=id_,
code_id=str(id_).replace('language','code'),
code_editor=find_code_editor(id_),
mode=codemapper[value])
然后我创建了一个名为CodeChoiceBlock
的自定义选择块,它继承了ChoiceBlock
。
我覆盖field
方法并将'widget': CodeSelectWidget()
添加到field_kwargs
,如下所示
def field(self):
field_kwargs = {
'widget': CodeSelectWidget(),
}
field_kwargs.update(self.field_options)
return forms.ChoiceField(**field_kwargs)
但是,当我更改选择输入的值时,没有任何反应。并且没有任何错误消息。