Лучший Виджет Поля Django Admin ManyToMany

Я нахожу значение по умолчанию администратора Django models.ManyToManyField виджет, чтобы быть громоздким для использования. Это HTML-код выберите элемент, и если у вас есть много объектов "другой" модели, то совершенно непрактично на самом деле найти "другие" объекты, которые вы хотите связать с "этим" объектом. И если у вас есть большое объектов" другой " модели, похоже, даже замедляет рендеринг страницы администратора.

Я знаю, что могу построить свой собственный пользовательский виджет администратора и применить его к my ManyToManyFields Как я считаю нужным, но есть ли какие-либо готовые, которые я мог бы использовать вместо этого? В моих снах я представляю себе автозаполнение текстового ввода HTML-виджета. Это даже практично / возможно сделать в рамках администратора Django?

спасибо.

4 ответов


попробуйте использовать filter_horizontal атрибут класса admin, например:

class SomeModelAdmin(admin.ModelAdmin):
    filter_horizontal = ('users',)

как говорится в документация, "добавление ManyToManyField в этот список вместо этого будет использовать изящный ненавязчивый интерфейс JavaScript "filter", который позволяет искать в параметрах". filter_vertical делает то же самое с немного другой макет.


вы можете попробовать использовать raw id в admin. и документы django: 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/автозаполнения для динамического получения результатов. Это отлично подходит для случая, когда у вас есть возможно, 5000 пользователей и хотят выбрать 3 или 4 из них, не дожидаясь 5k <option> элементы для загрузки и рендеринга.


Это старый вопрос, но я хочу добавить ответ здесь для людей, которые находят это так же, как и я: эта ситуация-именно то, для чего предназначены встроенные администраторы Django. В частности, я использую TabularInlines с необработанными полями идентификаторов для отношений "многие ко многим", у которых слишком много вариантов.

https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.TabularInline