Как сделать интуитивно понятное поле формы для M2M отношений с большим количеством опций в Django?
Прошу прощения, если заголовок плохо сформулирован, я не смог найти лаконичный способ описать этот вопрос.
Я работаю с клиентом, который использует библиотеку форм Django для того, чтобы пользователи могли создавать/редактировать экземпляры моделей. Недавно я добавил отношения "многие ко многим" между моделью A и моделью B, и я хочу, чтобы на форме модели A был вход, позволяющий пользователям подключать к ней экземпляры модели B. Виджет SelectMultiple
, используемый Django по умолчанию, неинтуитивно понятен, а альтернативный виджет CheckboxSelectMultiple
кажется не очень удобным, когда есть сотни вариантов (что является вероятным сценарием). Все усложняется еще и тем, что между моделями C и D есть M2M отношения, связанные сквозной таблицей, которая определяет порядок экземпляра D на экземпляре C, а ни один из этих виджетов не работает хорошо со сквозными таблицами.
Первоначально я думал использовать CheckboxSelectMultiple
и просто упорядочить уже выбранные опции сверху, обернув виджет в контейнер с переполнением при прокрутке. Но, к сожалению, я не знаю, как упорядочить опции таким образом, поскольку принятый параметр queryset
по своей сути является неупорядоченным. В случае со сквозной таблицей, в идеале, каждая отмеченная опция должна иметь рядом вход, где пользователи могли бы установить порядок соответствующих экземпляров, но я не уверен, как коренным образом изменить виджет таким образом.
Итак, как бы вы посоветовали мне сделать поле формы для M2M отношений с большим количеством опций? Есть ли способ заставить работать мою модифицированную идею CheckboxSelectMultiple
, или есть альтернативный, более эффективный способ сделать это (возможно, с использованием библиотек)? Я не могу представить, что я первый человек, столкнувшийся с этой проблемой.
Вот "один, который я написал ранее" Извините, это немного информационный дамп. Работает, но не полностью протестировано. Проверьте, что он csrf-безопасен, если вас это волнует (он не использует форму, просто выбирает вещи из request.POST)