Django过滤器多选择列表在管理员

时间:2020-06-09 22:00:56

标签: django django-admin

我有一个django模型,其自引用如下所示的多对多字段。

 class Product(ModelBase):
    name = models.CharField(max_length=1000)
    category = models.ForeignKey(Category, on_delete=models.DO_NOTHING)
    company = models.ForeignKey(Company, on_delete=models.DO_NOTHING)
    alternatives = models.ManyToManyField('self', symmetrical=False, blank=True)

我对django管理表单感到特别满意,因为该表单将替代品的选项作为多选列表框列出,因为对于许多产品,选择一种或多种替代产品将变得很繁琐。 enter image description here 有没有一种方法可以丰富这种用户体验,我已经看过django-advanced-filters了,但是它不适用于django3。本质上,如果我可以进行预输入搜索来过滤列表中的项目并限制初始根据所选类别列出。

----更新---- admin.py

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    search_fields = ['name', ]


@admin.register(Company)
class CompanyAdmin(admin.ModelAdmin):
    search_fields = ['name', ]
    list_display = ['name', 'website', ]


@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    search_fields = ['name', ]
    list_filter = ['category', ]
    list_display = ['name', 'category', 'company', ]

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

ManyToManyField的默认行为将显示为vertical display

您需要做的是使用filter_horizontal选项在admin.py上添加一行,将ManyToManyField的显示更改为水平显示。

from django.contrib import admin

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    search_fields = ['name', ]
    list_filter = ['category', ]
    list_display = ['name', 'category', 'company', ]
    filter_horizontal = ['alternatives', ]

它随后将在您的管理页面上显示为以下内容:

enter image description here

可以在您的Authentication and Authorization管理员的Groups添加表单上看到此示例。

enter image description here