Лучше Django Админ ManyToMany Поле Виджет


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

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

Спасибо.

4 88

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