Un meilleur widget de champ ManyToMany Admin Django

101

Je trouve que le models.ManyToManyFieldwidget par défaut de Django Admin est compliqué à utiliser. C'est l' élément de sélection HTML et si vous avez beaucoup d'objets du modèle «autre», alors il est tout à fait impossible de trouver les «autres» objets que vous voulez associer à «cet» objet. Et si vous avez beaucoup d'objets du modèle «autre», cela semble même ralentir le rendu de la page Admin.

Je suis conscient que je peux créer mon propre widget d'administration personnalisé et l'appliquer à mon choix ManyToManyFields, mais y en a-t-il des préconstruits que je pourrais utiliser à la place? Dans mes rêves, j'imagine un widget HTML de saisie de texte à saisie semi-automatique. Est-ce même pratique / possible de le faire dans le cadre d'administration de Django?

Merci.

Chris W.
la source

Réponses:

160

Essayez d'utiliser l' filter_horizontalattribut sur votre classe d'administration, par exemple:

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

Comme mentionné dans la documentation , "l'ajout d'un champ ManyToManyField à cette liste utilisera à la place une interface de" filtre "JavaScript discrète qui permet de rechercher dans les options". filter_verticalfait la même chose avec une disposition légèrement différente.

Blair
la source
Génial! Cela ressemble exactement à ce que je recherche, je vais essayer.
Chris W.
Son fonctionnement Mais comment rendre ce fichier en lecture seule. Je suis essayez en lecture seule_fields = ('utilisateurs',). Mais il est indiqué sur une seule ligne séparée par une virgule. Je veux être montré dans le saut de ligne ...
Varnan K
J'avais peur de devoir écrire mon propre widget, mais c'est parfait! Merci pour ça! ; P
umat
7

vous pouvez essayer d'utiliser un identifiant brut dans l'administrateur. et la documentation django: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

si vous cherchez quelque chose avec la saisie semi-automatique, vous voudrez peut-être regarder cela comme point de départ http://code.djangoproject.com/wiki/AutoCompleteSolutions

et enfin un exemple en ligne très simpliste:

models.py

class SomeModel(models.Model):
    users = models.ManyToMany(User)

admin.py:

class SomeModelAdmin(admin.ModelAdmin):
    raw_id_fields = ("users",)
mrfunyon
la source
3

Je n'ai pas vraiment joué avec mais j'ai trouvé cette bibliothèque prometteuse référencée ailleurs.

Il semble faire exactement ce que je voulais. Plutôt que de charger la liste entière des objets associés (quel que soit le nombre!) Et de vous présenter un sélecteur pour en sélectionner quelques-uns, comme le filter_horizontalfait, il présente une boîte de recherche / filtre et utilise des appels de saisie / saisie automatique pour récupérer les résultats dynamiquement. C'est idéal pour le cas où vous avez peut-être 5000 utilisateurs et que vous souhaitez en choisir 3 ou 4 sans attendre le <option>téléchargement et le rendu des éléments de 5k .

Codeur
la source
0

C'est une vieille question, mais je veux ajouter une réponse ici pour les personnes qui trouvent cela comme moi: cette situation est exactement ce à quoi servent les administrateurs en ligne de Django. Plus précisément, j'utilise TabularInlines avec des champs d'id bruts pour les relations plusieurs-à-plusieurs qui ont trop de choix.

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

Kloddant
la source