Как динамически изменить тип поля Django Form (например, `forms.CharField` на `forms.ChoiceField`) без изменения переменной-члена данных?

TL;DR

Как я могу изменить поисковый термин CharField (в любой из строк на изображении ниже) на другой тип поля (например, ChoiceField, DateField и т.д.) на основе типа выбранного поля базы данных (в первом списке select в этой строке - см. скриншот ниже)?

Длинная версия

У меня есть классный иерархический интерфейс расширенного поиска, например:

enter image description here

Каждая строка задает поисковый термин/условие и читается как поиск, например:

<field> <condition> <term>

e.g.

age > 5

где имена полей формы:

  • fld (для "поля базы данных")
  • ncmp (для "отрицаемого типа сравнения")
  • val (для поискового термина)

Есть скрытое поле pos для данных типа иерархии и группы, но это не имеет отношения к моему вопросу.

Строки и подгруппы могут быть динамически добавлены/удалены в/из иерархии и могут быть and-ed или or-ed вместе.

Это отлично работает. Но проблема, которую я хочу решить, заключается в том, что она несколько ограничена типом поля. Я хотел бы иметь возможность динамически изменять содержимое списка выбора condition (ncmp) и тип поля термина поиска (val) на основе выбранного поля базы данных (fld) (или выбранного condition, например, если isnull: скрыть поле термина). Вот несколько примеров того, что я хочу:

  1. If the selected field is a timestamp, I'd like the condition list to have selections like before/after/on day/etc and the term field to be a "timestamp" field with like a calendar widget or something
  2. If the field is a number type DB field, remove the contains/ends with/starts with/etc condition items and use a number validator on the term field
  3. If the field is an enumeration DB field, populate the condition select list with is/is not/is null/is not null/etc and make the term field a select list

Есть ли какие-нибудь стандартные способы сделать это? В идеале, форма должна по-прежнему иметь только 3 поля (fld, ncmp и val), чтобы мне не пришлось переделывать иерархический javascript, который управляет наборами форм, но я могу сделать это, если необходимо.

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