C'è un modo semplice per mostrare un ManyToManyField come caselle di controllo in Django Admin ?? Eventuali suggerimenti?Mostra un ManyToManyField come caselle di controllo in Django Admin
risposta
Da this answer sembra che è possibile utilizzare per sovrascrivere il ModelAdmin.formfield_overrides ManyToManyField di utilizzare 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},
}
non l'ho provato e sto solo citando la fonte, ma sembra plausibile. In bocca al lupo.
Attenzione: come @errx giustamente sottolineato, i documentation mette in evidenza il seguente avvertimento:
Se si desidera utilizzare un widget personalizzato con un campo di relazione (cioè
ForeignKey
o ManyToManyField), assicurati che il numero non includa il nome di quel campo inraw_id_fields
oradio_fields
.
formfield_overrides
non ti consente di cambiare il widget sul campi di relazione che hannoraw_id_fields
oradio_fields
set. Questo perchéraw_id_fields
eradio_fields
implicano i widget personalizzati .
c'è un avviso da django docs. Se si desidera utilizzare un widget personalizzato con un campo di relazione (cioè ForeignKey o ManyToManyField), assicurarsi di non aver incluso il nome di quel campo in raw_id_fields o radio_fields. formfield_overrides non ti consente di modificare il widget sui campi di relazione che hanno set raw_id_fields o radio_fields. Questo perché raw_id_fields e radio_fields implicano propri widget personalizzati. – errx
Grazie per l'avviso. Metterà un avvertimento in risposta. –
Penso che non ci sia un modo semplice per farlo. Puoi provare a sovrascrivere la classe ModelAdmin ma questo non è un modo "semplice".
Ma è possibile utilizzare filter_horizontal o filter_vertical aggiungere quasi simile funzionalità
Questo è certamente possibile. Ecco il codice che è possibile inserire nella ModelAdmin
sottoclasse:
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)
Questo è stato derivato dal guardare nel codice amministratore.
Per ignorare per un singolo campo che segue è 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
vorrei suggerire cambiando la risposta accettata, in modo da non confondere i visitatori. – surfer190