Лучше Django Админ ManyToMany Поле Виджет
Я нахожу виджет администратора Django по умолчанию models.ManyToManyField
громоздким в использовании. Это элементHTML select , и если у вас есть много объектов "другой" модели, то довольно непрактично на самом деле найти "другие" объекты, которые вы хотите связать с "этим" объектом. А если у вас есть очень много из объектов" другой " модели это, кажется, даже замедляет рендеринг админки страницы.
Я знаю, что могу создать свой собственный виджет администратора и применить его к моему ManyToManyFields
, Как я считаю нужным, но есть ли там какие-либо готовые, которые я мог бы использовать вместо этого? В моих мечтах я представляю себе HTML-виджет с автозавершением ввода текста. Это вообще практично/возможно сделать в рамках администратора Django?
Спасибо.
4 ответа:
Попробуйте использовать атрибут
filter_horizontal
в вашем классе администратора, например:class SomeModelAdmin(admin.ModelAdmin): filter_horizontal = ('users',)
Как упоминалось вдокументации , "добавление ManyToManyField в этот список вместо этого будет использовать изящный ненавязчивый интерфейс JavaScript "filter", который позволяет искать в пределах опций".
filter_vertical
делает то же самое с немного другой компоновкой.
Вы можете попробовать использовать код в админ. и документы Джанго: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields
Если вы ищете что-то с автозаполнением, вы можете посмотреть на это как на отправную точку http://code.djangoproject.com/wiki/AutoCompleteSolutions
И, наконец, очень упрощенный встроенный Пример:
Models.py
class SomeModel(models.Model): users = models.ManyToMany(User)
Admin.py:
class SomeModelAdmin(admin.ModelAdmin): raw_id_fields = ("users",)
Я на самом деле не играл с ним, но я нашел эту многообещающую библиотеку, на которую ссылаются в другом месте.
Похоже, он делает именно то, что я хотел. Вместо того, чтобы загружать весь список связанных объектов (независимо от того, сколько их там!) и представляя вам средство выбора для выбора нескольких из них, как это делаетfilter_horizontal
, он представляет окно поиска/фильтра и использует вызовы typeahead/autocomplete для динамического извлечения результатов. Это отлично подходит для случая, когда у вас есть, возможно, 5000 пользователей и вы хотите выбрать 3 или 4 из них, не дожидаясь загрузки и визуализации 5K<option>
элементов.
Это старый вопрос, но я хочу добавить ответ здесь для людей, которые находят это так же, как и я: эта ситуация-именно то, для чего предназначены встроенные администраторы Django. В частности, я использую TabularInlines с необработанными полями идентификаторов для отношений "многие ко многим", которые имеют слишком много вариантов.
Https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.TabularInline