Лучший админ Django Виджет поля ManyToMany

82

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

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

Спасибо.

Теги:
django-admin
html-select

3 ответа

138
Лучший ответ

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

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

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

  • 0
    Большой! Это звучит как то, что я ищу, я попробую.
  • 2
    отлично, это делает много более понятным использование
Показать ещё 1 комментарий
6

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню