我想将many2many关系的窗口小部件类型更改为“FilteredSelectMultiple”
我从其他问题和文档中了解到这应该可以解决问题
admin.py
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.db import models
from django import forms
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
forms.ModelMultipleChoiceField: {'widget': FilteredSelectMultiple},
}
不幸的是,管理页面没有任何变化。有人可以帮忙吗?
答案 0 :(得分:8)
您的formfield_overrides
没有任何效果,因为您应该使用模型字段,即models.ManyToManyField
而不是表单字段forms.MultipleChoiceField
。但是,只需将密钥切换为models.ManyToManyField
即可使用,因为小部件should be instantiated具有字段名称和布尔值is_stacked
。
还有其他几种方法:
要对单个字段使用FilteredSelectMultiple
,请使用filter_horizonal
或filter_vertical
选项。
class MyModelAdmin(admin.ModelAdmin):
filter_horizontal = ('my_m2m_field',)
要覆盖所有多对多字段的窗口小部件,您可以覆盖formfield_for_manytomany
。
from django.contrib.admin import widgets
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_manytomany(self, db_field, request, **kwargs):
vertical = False # change to True if you prefer boxes to be stacked vertically
kwargs['widget'] = widgets.FilteredSelectMultiple(
db_field.verbose_name,
vertical,
)
return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
不要忘记向模特管理员注册您的模型。
admin.site.register(MyModel, MyModelAdmin)