Django admin 显示过滤器取决于其他过滤器

Sam*_*uel 6 python django django-admin

以下是模型示例:

class Books(models.Model):
    ...

class Chapter(models.Model):
    ... 
    book = models.ForeignKey('Books')

class Exercise(models.Model):
    ...
    book = models.ForeignKey('Books')
    chapter = models.ForeignKey('Chapter') 
Run Code Online (Sandbox Code Playgroud)

这是用于练习的 Admin 类:

class ExerciseAdmin(admin.ModelAdmin):
   ...
   list_filter = (('book',admin.RelatedOnlyFieldListFilter),('chapter',admin.RelatedOnlyFieldListFilter))

admin.site.register(Exercise, ExerciseAdmin)
Run Code Online (Sandbox Code Playgroud)

我现在有了过滤器bookchapterfor exercise. 当我点击book过滤器中的a时book,它会相应地显示所有exercises选定的内容book。但是在过滤器列表中chapter,它仍然显示所有的chapters所有books

有没有办法只能显示,在过滤器chapterchaptersbook,我在第一过滤器中选择book?如何?

Sam*_*uel 6

我不确定这是否是最好的方法,但在这里我使用管理面板中 url 的 GET 参数来获取书籍的 ID,然后我可以选择相应的章节。它有效!

class ChapterFilter(admin.SimpleListFilter):
    title = 'chapter' 
    parameter_name = 'chapter'
    def lookups(self, request, model_admin):
        if 'book__id__exact' in request.GET:
            id = request.GET['book__id__exact']
            chapters = set([c.chapter for c in model_admin.model.objects.all().filter(book=id)])
        else:
            chapters = set([c.chapter for c in model_admin.model.objects.all()])
        return [(b.id, b.titre) for b in chapters]

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(chapter__id__exact=self.value())

class ExerciseAdmin(admin.ModelAdmin):
   list_filter = (('book',admin.RelatedOnlyFieldListFilter), (ChapterFilter))
Run Code Online (Sandbox Code Playgroud)