如何自定义多对多字段的django admin搜索结果

How to customize django admin search results in many to many fields

当我在多对多领域使用 lupe 时,我试图过滤显示的列表(下图)。 也许文本搜索也很有趣。

有什么帮助吗?

代码如下:

class PresentialModuleCourseInline(NestedStackedInline):
    """Module Course Presential Stacked Inline"""
     model = Course.modules.through
     raw_id_fields = ('module_course',)
     extra = 1

     def get_queryset(self, request):
        return self.model.objects.filter(
           module_course__type_course=ModuleCourse.PRESENTIAL)  # Doesn't work

self.model不是QuerySet也不是模型,直接使用模型:

class PresentialModuleCourseInline(NestedStackedInline):
     model = Course.modules.through
     raw_id_fields = ('module_course',)
     extra = 1

     def get_queryset(self, request):
        return Course.objects.filter(module_course__type_course=ModuleCourse.PRESENTIAL)

为您的 CourseAdmin 设置 search_fields 搜索:

class CourseAdmin(admin.ModelAdmin):
    search_fields = ('title',)  # your search fields here

要在 ForeignKeyRawIdWidget (lupe) 中创建过滤器,您需要添加一个 limit_choices_to 小部件,它会添加一个查询参数以在弹出页面中进行过滤,例如 ?type_course=online

样本:

class PresentialModuleCourseInline(NestedStackedInline):
"""Module Course Presential Stacked Inline"""
model = Course.modules.through
extra = 1
raw_id_fields = ('module_course', )

def get_formset(self, request, obj=None, **kwargs):
    form = super().get_formset(request, obj, **kwargs)
    field = form.form.base_fields['module_course']
    field.widget.rel.limit_choices_to =\
        {'type_course': ModuleCourse.PRESENTIAL}
    return form