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?
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 dansraw_id_fields
ouradio_fields
.
formfield_overrides
ne vous laissera pas changer le widget sur les champs relation qui ontraw_id_fields
ouradio_fields
ensemble. C'est parce queraw_id_fields
etradio_fields
impliquent widgets personnalisés de leur propre.
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.
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
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