准确地说,它是 Django 管理员在 ManyToManyField 的情况下选择显示的小部件。
在这种情况下,您觉得它的 SelectMultiple 小部件对用户不太友好。
很简单的部分是,您始终可以在使用自己的 ModelForm 时选择小部件。
但是如果你想在 Django Admin 中这样做,你需要一个往返。看看这个。
from django.forms import widgets
from django.contrib import admin
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_manytomany(self, db_field, request=None, **kwargs):
"""
Get a form Field for a ManyToManyField.
"""
# If it uses an intermediary model, don't show field in admin.
if db_field.rel.through is not None:
return None
if db_field.name in self.raw_id_fields:
kwargs['widget'] = admin.widgets.ManyToManyRawIdWidget(db_field.rel)
kwargs['help_text'] = ''
elif db_field.name in (list(self.filter_vertical) + list(self.filter_horizontal)):
kwargs['widget'] = admin.widgets.FilteredSelectMultiple(db_field.verbose_name, (db_field.name in self.filter_vertical))
else:
kwargs['widget'] = widgets.CheckboxSelectMultiple()
kwargs['help_text'] = ''
return db_field.formfield(**kwargs)
现在,在 admin.py 中定义你的日常管理员为
class SomeModelAdmin(MyModelAdmin):
search_fields = ['foo', 'bar']
list_display = ('foo',)
ordering = ('-bar',)
admin.site.register(SomeModel, SomeModelAdmin)
您现在将在 DJango Admin 中获得复选框。当然,您需要对 CSS 进行一些更改。