2011-03-22 3 views
84

Je trouve que le widget par défaut de l'administrateur Django, models.ManyToManyField, est lourd à utiliser. C'est l'élément HTML select et si vous avez beaucoup d'objets de l'autre modèle alors il est assez difficile de trouver réellement les "autres" objets que vous voulez associer à "cet" objet. Et si vous avez des objets de l'autre modèle, il semble même ralentir le rendu de la page d'administration.Un meilleur administrateur Django ManyToMany Field Widget

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

Merci.

Répondre

135

Essayez d'utiliser l'filter_horizontal attribut de votre classe d'administration, par exemple:

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

Comme mentionné dans the documentation, « l'ajout d'un ManyToManyField à cette liste au lieu d'utiliser un astucieux JavaScript discret « interface filtre » qui permet la recherche dans les options ". filter_vertical fait la même chose avec une disposition légèrement différente.

+0

Parfait! Cela ressemble exactement à ce que je cherche, je vais essayer. –

+2

excellent, il rend le manytomany beaucoup plus clair à utiliser – maazza

+0

Son travail Mais comment faire ce fichier en lecture seule. Je suis essayer lire only_fields = ('utilisateurs',). Mais Son montré dans une seule ligne séparée par une virgule. Je veux montrer en ligne break ... –

6

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

si vous cherchez quelque chose avec autocomplétion-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",) 
3

Je n'ai pas joué avec mais j'ai trouvé this promising looking library référencé ailleurs.

Il semble faire exactement ce que je voulais. Plutôt que de charger toute la liste des objets liés (quel que soit leur nombre!) Et de vous présenter un sélecteur pour en sélectionner quelques-uns, comme le fait filter_horizontal, il présente une boîte de recherche/filtre et utilise des appels typeahead/autocomplete pour récupérer résultats dynamiquement. C'est génial pour le cas où vous avez peut-être 5000 utilisateurs et que vous voulez en choisir 3 ou 4 sans attendre 5k <option> éléments à télécharger et à rendre.