Динамическое применение виджета в зависимости от значения поля

В проекте 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? Есть ли другой способ?
Спасибо

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