Montrer un ManyToManyField comme des cases à cocher dans Django Admin

y a-t-il un moyen simple de montrer un ManyToManyField comme des cases à cocher dans Django Admin?? Toutes les suggestions?

20
demandé sur Oak Bytes 2011-01-24 19:45:21

4 réponses

à Partir de cette réponse il me semble qu'il est possible d'utiliser ModelAdmin.formfield_overrides pour remplacer le ManyToManyField à utiliser CheckBoxSelectMultiple :

from django.db import models
from django.contrib import admin
from django.forms import CheckboxSelectMultiple

class MyModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.ManyToManyField: {'widget': CheckboxSelectMultiple},
    }

Je ne l'ai pas essayé et je cite simplement la source, mais cela semble plausible. Bonne chance.

avertissement : comme @errx à juste titre indiqué la "documentation 1519120920 met en évidence la mise en garde suivante:

si vous voulez utiliser un widget personnalisé avec un champ de relation (i.e. ForeignKey ou ManyToManyField ), assurez-vous que vous n'ont pas inclus le nom de ce champ dans raw_id_fields ou radio_fields .

formfield_overrides ne vous laissera pas changer le widget sur les champs relation qui ont raw_id_fields ou radio_fields ensemble. C'est parce que raw_id_fields et radio_fields impliquent widgets personnalisés de leur propre.

50
répondu Shawn Chin 2017-05-23 12:10:34

C'est très certainement possible. Voici le code que vous pouvez placer dans la sous-classe ModelAdmin :

def formfield_for_manytomany(self, db_field, request=None, **kwargs):
    if db_field.name == 'your field name':
        kwargs['widget'] = form_widgets.CheckboxSelectMultiple()
        kwargs['help_text'] = ''

    return db_field.formfield(**kwargs)

cela a été dérivé de la recherche dans le code d'administration.

4
répondu vdboor 2011-06-30 12:48:57

pour outrepasser pour un seul champ ce qui suit est utile:

def get_form(self, request, obj=None, **kwargs):
    form = super(VNodeAdmin, self).get_form(request, obj, **kwargs)
    form.base_fields['node_type'].widget = forms.CheckboxSelectMultiple()
    return form
4
répondu rbell01824 2014-01-07 16:04:34

je pense qu'il n'y a pas de façon simple de faire cela. Vous pouvez essayer de surcharger la classe ModelAdmin mais ce n'est pas une manière "simple".

mais vous pouvez utiliser filter_horizontal ou filter_vertical pour ajouter des fonctionnalités presque similaires

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.filter_horizontal

0
répondu errx 2011-01-24 17:01:32