Django Admin更改小部件类型

时间:2015-11-17 10:10:28

标签: django django-admin

我想将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},
    }

不幸的是,管理页面没有任何变化。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:8)

您的formfield_overrides没有任何效果,因为您应该使用模型字段,即models.ManyToManyField而不是表单字段forms.MultipleChoiceField。但是,只需将密钥切换为models.ManyToManyField即可使用,因为小部件should be instantiated具有字段名称和布尔值is_stacked

还有其他几种方法:

要对单个字段使用FilteredSelectMultiple,请使用filter_horizonalfilter_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)