2013-03-27 4 views
2

Dans l'admin de Django, je voudrais vraiment vraiment comme pour pouvoir afficher un ManyToManyField éditable dans l'affichage de liste.Administrateur Django: ManyToManyField dans list_editable?

Le contrôle ManyToManyField ne doit pas forcément être complet. Le fait de pouvoir enregistrer une seule valeur suffirait pour l'affichage de la liste (bien que les valeurs sous-jacentes soient de type many-to-many).

Mon modèle ressemble à ceci:

class Item(models.Model): 
    name = models.CharField(max_length=500) 
    colour = models.ManyToManyField(Colour, related_name='primary_colour') 

Si j'essaie ceci dans admin.py:

class ItemAdmin(admin.ModelAdmin): 
    list_display = ('name', 'colour') 
    list_editable = ('colour') 

Puis-je obtenir cette erreur:

'ItemAdmin.list_display[6]', 'colour' is a ManyToManyField which is not supported. 

Y at-il quelque façon que ce tous que je peux montrer un ManyToManyField éditable pour editi rapide ng dans l'affichage de la liste?

Je trouve cette question connexe, qui explique comment rendre les valeurs visibles dans l'affichage de la liste, mais non modifiable: ManyToManyField widget in a django admin change list?

Répondre

1

Vous pouvez facilement ajouter une vue personnalisée à vos urls admin et ajouter le code html/javascript requis/ajax. Voici les bases:

class ItemAdmin(admin.ModelAdmin): 
    # regular stuff 

    def render_foo(self, obj): 
     # add this to your list_display 
     html = '<stuff><input/submit action></stuff>' 
     return mark_safe(html) 

    def get_urls(self): 
     urls = super(ItemAdmin, self).get_urls() 
     extra_urls = patterns('', 
      (r'^process_foo/$', self.admin_site.admin_view(self.process_foo)), 
     ) 
     return extra_urls + urls 

    def process_foo(self, request): 
     if not request.is_ajax(): 
      raise Http404 
     foo = request.GET.get("attr") 
     # process m2m 
     # return some json 
+0

Merci! Je pense que j'ai besoin d'un peu plus de conseils ici: je peux faire fonctionner ça en l'état, mais que dois-je mettre dans 'render_foo'? Devrait-il être un formulaire avec une liste de sélection où l'utilisateur peut sélectionner plusieurs couleurs et qui soumet à 'process_foo' via Ajax, est-ce l'idée? – Richard

+0

Vous n'avez pas besoin d'un formulaire pour envoyer des données, utilisez simplement ce dont vous avez besoin et envoyez les données avec ajax au backend, n'oubliez pas de le valider. HTML5 [attributs de données] (http://ejohn.org/blog/html-5-data-attributes/) est un moyen sympa de gérer les données, vous pouvez mettre à jour l'attribut avec jquery ou javascript brut onclick ou sélectionner change. –