python - Mostrar un ManyToManyField como casillas de verificación en Django Admin
django-models django-admin (4)
¿Existe una forma sencilla de mostrar un ManyToManyField como Checkboxes en Django Admin? ¿Alguna sugerencia?
A partir de esta respuesta parece que es posible usar ModelAdmin.formfield_overrides para anular el ManyToManyField para usar 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},
}
No lo he probado y simplemente estoy citando la fuente, pero parece plausible. Buena suerte.
Advertencia : como @errx señaló acertadamente, la ModelAdmin.formfield_overrides destaca la siguiente advertencia:
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 enraw_id_fields
oradio_fields
.
formfield_overrides
no le permitirá cambiar el widget en los campos de relación que tienenraw_id_fields
oradio_fields
establecidos. Esto se debe a queraw_id_fields
yradio_fields
implican widgets personalizados propios.
Creo que no hay una manera simple de hacer esto. Puede intentar anular la clase ModelAdmin pero esta no es una forma "simple".
Pero puede usar filter_horizontal o filter_vertical para agregar una funcionalidad casi similar
Esto es ciertamente posible. Aquí está el código que puede colocar en la subclase 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)
Esto se derivó de mirar en el código de administración.
Para anular para un solo campo lo siguiente 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