【问题标题】:django filter multi select list in admindjango在管理员中过滤多选列表
【发布时间】:2020-09-29 05:15:35
【问题描述】:

我有一个 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 管理表单将替代选项列为多选列表框并不特别满意,因为对于大量产品,选择一个或多个替代产品将变得乏味。 有没有办法可以丰富这种用户体验,我已经查看了 django-advanced-filters 但它不适用于 django 3。基本上,如果我可以有一个预先输入的搜索来过滤列表中的项目并限制初始根据所选类别列出。

----更新---- 管理员.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', ]

感谢您的帮助。

【问题讨论】:

  • 你能分享你的admin.py文件吗?

标签: django django-admin


【解决方案1】:

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

您需要做的是在您的admin.py 中添加一行,使用filter_horizontal 选项将您的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', ]

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

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

【讨论】:

    猜你喜欢
    • 2011-01-23
    • 2016-03-10
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多