2011-01-24 14 views

Respuesta

47

De this answer parece que es posible utilizar ModelAdmin.formfield_overrides para anular el ManyToManyField utilizar 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}, 
    } 

Yo no lo he probado y estoy simplemente citando la fuente, pero parece plausible. Buena suerte.

Advertencia: como @errx ha señalado acertadamente, los documentation aspectos más destacados de la siguiente salvedad:

Si desea utilizar un widget encargo con un campo de relación (es decir ForeignKey o ManyToManyField), asegúrese de que no hayan incluido el nombre de ese campo en raw_id_fields o radio_fields.

formfield_overrides no le permitirá cambiar el widget en los campos de relación que tienen raw_id_fields o radio_fields conjunto. Eso es porque raw_id_fields y radio_fields implican propios widgets personalizados.

+0

hay una advertencia de django docs. Si desea utilizar un widget personalizado con un campo de relación (es decir, ForeignKey o ManyToManyField), asegúrese de no haber incluido el nombre de ese campo en raw_id_fields o radio_fields. formfield_overrides no le permitirá cambiar el widget en los campos de relación que tienen raw_id_fields o radio_fields. Eso es porque raw_id_fields y radio_fields implican widgets personalizados propios. – errx

+0

Gracias por el aviso. Colocará una advertencia en respuesta. –

4

Esto es ciertamente posible. Aquí está el código que se puede colocar en el ModelAdmin subclase:

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) 

Esto se deriva de mirar en la clave de administrador.

4

Para anular para un solo campo de los siguientes es útil:

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 
Cuestiones relacionadas