Как динамически изменить тип поля Django Form (например, `forms.CharField` на `forms.ChoiceField`) без изменения переменной-члена данных?
TL;DR
Как я могу изменить поисковый термин CharField (в любой из строк на изображении ниже) на другой тип поля (например, ChoiceField, DateField и т.д.) на основе типа выбранного поля базы данных (в первом списке select в этой строке - см. скриншот ниже)?
Длинная версия
У меня есть классный иерархический интерфейс расширенного поиска, например:
Каждая строка задает поисковый термин/условие и читается как поиск, например:
<field>
<condition>
<term>
e.g.
age
>
5
где имена полей формы:
fld
(для "поля базы данных")ncmp
(для "отрицаемого типа сравнения")val
(для поискового термина)
Есть скрытое поле pos
для данных типа иерархии и группы, но это не имеет отношения к моему вопросу.
Строки и подгруппы могут быть динамически добавлены/удалены в/из иерархии и могут быть and-ed
или or-ed
вместе.
Это отлично работает. Но проблема, которую я хочу решить, заключается в том, что она несколько ограничена типом поля. Я хотел бы иметь возможность динамически изменять содержимое списка выбора condition
(ncmp
) и тип поля термина поиска (val
) на основе выбранного поля базы данных (fld
) (или выбранного condition
, например, если isnull
: скрыть поле термина). Вот несколько примеров того, что я хочу:
- If the selected
field
is a timestamp, I'd like thecondition
list to have selections likebefore/after/on day/etc
and theterm
field to be a "timestamp" field with like a calendar widget or something - If the
field
is a number type DB field, remove thecontains/ends with/starts with/etc
condition
items and use a number validator on theterm
field - If the
field
is an enumeration DB field, populate thecondition
select list withis/is not/is null/is not null/etc
and make theterm
field a select list
Есть ли какие-нибудь стандартные способы сделать это? В идеале, форма должна по-прежнему иметь только 3 поля (fld
, ncmp
и val
), чтобы мне не пришлось переделывать иерархический javascript, который управляет наборами форм, но я могу сделать это, если необходимо.