Динамическое применение виджета в зависимости от значения поля
В проекте Django у меня есть форма с use_format флажком (по умолчанию не отмеченным) и post текстовым полем. Поскольку я хочу иметь возможность добавить дополнительные возможности к текстовому полю post, например, форматирование текста, я импортировал для этого виджет RichTextEditor.
.
Дело в том, что я хочу использовать виджет RichTextEditor в post, только если use_format отмечен.
class ArticleForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ArticleForm, self).__init__(*args, **kwargs)
if not self.instance.use_format:
self.fields['post'] = forms.CharField(widget=forms.Textarea)
class Meta:
model = Article
fields = '__all__'
widgets = {
'post': RichTextEditor(options={...}),
}
До сих пор, когда я хотел создать статью с форматированием, я создавал статью с установленным флажком use_format. Сохраняю. Затем редактирую статью и там у меня есть post с RichTextEditor.
Я хотел бы, чтобы post автоматически переключался между CharField и RichTextEditor, когда я устанавливаю или снимаю флажок use_format.
Во-первых, возможно ли это?
Что я пробовал:
Я добавил пользовательский скрипт в ModelAdmin для обнаружения изменений значения use_format
class ArticleAdmin(admin.ModelAdmin):
form = ArticleForm
class Media:
js = ('js/toggleUseFormat.js')
toggleUseFormat.js:
if (!$) {
$ = django.jQuery;
}
$(document).ready(function () {
$("#id_use_format").change(function () {
// I can see the value of post here
console.log("post: ", $("#id_post").val());
if ($(this).is(":checked")) {
// TODO: apply RichTextEditor widget
} else {
// TODO: apply CharField widget
}
});
});
После долгих поисков на SO я узнал, как определить изменение значения флажка, но, как советуют TODO, я не понял, как применить виджеты здесь. Похоже, что я могу изменить только значение post, но не тип.
Возможно ли это сделать с помощью jQuery? Есть ли другой способ?
Спасибо