web-dev-qa-db-fra.com

Un meilleur Django Admin Widget de champ ManyToMany

Je trouve le Django Admin par défaut models.ManyToManyField widget à encombrer à utiliser. Il s'agit de l'élément HTML select et si vous avez beaucoup d'objets du "autre" modèle, il est assez difficile de trouver réellement les "autres" objets que vous souhaitez associer à "cet" objet. Et si vous avez beaucoup des objets de "l'autre" modèle, il semble même ralentir le rendu de la page Admin.

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

Merci.

93
Chris W.

Essayez d'utiliser le filter_horizontal attribut sur votre classe d'administration, par exemple:

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

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

151
Blair

vous pouvez essayer d'utiliser un identifiant brut dans l'administrateur. et les documents 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 un 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",)
7
mrfunyon

Je n'ai pas réellement joué avec mais j'ai trouvé cette bibliothèque à l'aspect prometteur référencé ailleurs.

Il semble faire exactement ce que je voulais. Plutôt que de charger la liste complète des objets associés (quel que soit leur nombre!) Et de vous présenter un sélecteur pour en sélectionner quelques-uns, comme filter_horizontal le fait, il présente une zone de recherche/filtre et utilise des appels typeahead/autocomplete pour récupérer dynamiquement les résultats. 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 5k <option> éléments à télécharger et à rendre.

3
Coderer

Ceci est une vieille question, mais je veux ajouter une réponse ici pour les personnes qui trouvent cela comme moi: cette situation est exactement à quoi servent les administrateurs en ligne Django. En particulier, j'utilise TabularInlines avec champs 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

0
kloddant