2011-01-24 1 views

Répondre

47

De this answer il 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 suis simplement citer la source, mais il semble plausible. Bonne chance.

Avertissement: comme @errx soutient à juste titre, les documentation met en évidence la mise en garde suivante:

Si vous voulez utiliser un widget personnalisé avec un champ de relation (c.-à-ForeignKey ou ManyToManyField), assurez-vous que n'a 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 de 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 leurs propres.

+0

il y a un avertissement de django docs. Si vous souhaitez utiliser un widget personnalisé avec un champ de relation (par exemple ForeignKey ou ManyToManyField), assurez-vous que vous n'avez pas inclus le nom de ce champ dans raw_id_fields ou radio_fields. Formfield_overrides ne vous laissera pas modifier le widget sur les champs de relation qui ont raw_id_fields ou radio_fields ensemble. C'est parce que raw_id_fields et radio_fields impliquent leurs propres widgets. – errx

+0

Merci pour les heads-up. Placera un avertissement en réponse. –

4

Ceci est 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

Pour remplacer 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 
Questions connexes