python django django-models django-admin manytomanyfield

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 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 establecidos. Esto se debe a que raw_id_fields y radio_fields implican widgets personalizados propios.



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