Django在管理中过滤多选列表

Chi*_*mar 4 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)
Run Code Online (Sandbox Code Playgroud)

我对 django 管理表单不是特别满意,该表单将替代品的选项列为多选列表框,因为对于大量产品,选择一个或多个替代产品将变得乏味。 在此输入图像描述 有没有一种方法可以丰富这种用户体验,我已经研究过 django-advanced-filters 但它不适用于 django 3。本质上,如果我可以进行预输入搜索来过滤列表中的项目并限制初始值基于所选类别的列表。

----更新---- 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', ]
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助。

Ber*_*rte 6

a 的默认行为ManyToManyField垂直显示

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

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', ]
Run Code Online (Sandbox Code Playgroud)

然后它将在您的管理页面上显示如下:

在此输入图像描述

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

在此输入图像描述