Кращий Django Admin ManyToMany Field Widget


101

Я вважаю, що models.ManyToManyFieldвіджет за замовчуванням адміністратора Django є громіздким у використанні. Це елемент вибору HTML, і якщо у вас є багато Об'єктів "іншої" моделі, то насправді знайти "інші" Об'єкти, які ви хочете пов'язати з "цим" Об'єктом, зовсім недоцільно. І якщо у вас є багато об’єктів "іншої" моделі, це, здається, навіть уповільнює візуалізацію сторінки адміністратора.

Я усвідомлюю, що можу створити власний віджет адміністратора та застосувати його до свого, ManyToManyFieldsяк вважаю за потрібне, але чи є якісь заздалегідь вбудовані, які я можу використовувати замість цього? У своїх мріях я малюю віджет HTML, що автоматично завершує текст. Це навіть практично / можливо зробити в рамках адміністратора Django?

Дякую.

Відповіді:


160

Спробуйте використовувати filter_horizontalатрибут у вашому класі адміністратора, наприклад:

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

Як зазначено в документації , "додавання ManyToManyField до цього списку замість цього буде використовувати чудовий ненав'язливий інтерфейс JavaScript" фільтр ", який дозволяє здійснювати пошук у межах параметрів". filter_verticalробить те ж саме з дещо іншим компонуванням.


Чудово! Це звучить як саме те, що я шукаю, я спробую.
Кріс В.

Його робота Але як зробити це подано лише для читання. Я намагаюся прочитати only_fields = ('користувачі',). Але його показано в одному рядку, розділеному комою. Я хочу, щоб показали у перерві рядка ...
Varnan K

Я хвилювався, що мені доведеться написати власний віджет, але це ідеально! Дякую за це! ; P
умат

7

ви можете спробувати використати необроблений ідентифікатор в адміністраторі. та документи 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",)

3

Я насправді не грав з цим, але знайшов цю багатообіцяючу бібліотеку з посиланням деінде.

Здається, робити саме те, що я хотів. Замість того, щоб завантажувати весь список пов’язаних об’єктів (незалежно від того, скільки їх є!) І представляти вам filter_horizontalзасобом вибору, щоб вибрати декілька з них, як це робиться, він представляє вікно пошуку / фільтру та використовує виклики / автозаповнення викликів для отримання результатів динамічно. Це чудово підходить для випадку, коли у вас може бути 5000 користувачів, і ви хочете вибрати 3 або 4 з них, не чекаючи <option>завантаження та візуалізації 5 к. Елементів.


0

Це давнє запитання, але я хочу додати тут відповідь для людей, які вважають це так само, як і я: саме ця ситуація - саме те, для чого потрібні адміністратори Django. Зокрема, я використовую TabularInlines з неочищеними полями ідентифікаторів для відносин багато-до-багатьох, які мають занадто багато варіантів.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.