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.
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.
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",)
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.
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