Python 如何在django管理仪表板中构建链接过滤器
我想在django管理仪表板链式过滤器,请帮助我实现它。 我有3种型号:- 黑板、年级和章节。 最初,当仪表板加载时,应仅显示板过滤器,选择板过滤器后,应显示所选板所有过滤器,选择等级后,应显示该等级的所有章节 我试过RelatedDropdownFilter但这很正常, 它不修改dropdownfilter的视图部分,而是显示所有结果 我的模型:-Python 如何在django管理仪表板中构建链接过滤器,python,django,filter,django-admin,django-filter,Python,Django,Filter,Django Admin,Django Filter,我想在django管理仪表板链式过滤器,请帮助我实现它。 我有3种型号:- 黑板、年级和章节。 最初,当仪表板加载时,应仅显示板过滤器,选择板过滤器后,应显示所选板所有过滤器,选择等级后,应显示该等级的所有章节 我试过RelatedDropdownFilter但这很正常, 它不修改dropdownfilter的视图部分,而是显示所有结果 我的模型:- class LmsBoard(models.Model): name = models.CharField(max_length=240)
class LmsBoard(models.Model):
name = models.CharField(max_length=240)
class LmsGrade(models.Model):
name = models.CharField(max_length=240)
board = models.ForeignKey(LmsBoard, models.DO_NOTHING)
class LmsSubject(models.Model):
name = models.CharField(max_length=240)
grade = models.ForeignKey(LmsGrade, models.DO_NOTHING)
board = models.ForeignKey(LmsBoard,models.DO_NOTHING)
class LmsChapter(models.Model):
name = models.CharField(max_length=240,default='None')
subject = models.ForeignKey(LmsSubject, models.DO_NOTHING)
我的admin.py:-
@admin.register(MyModel)
class MyModel(admin.ModelAdmin):
list_display = (
'board', 'grade', 'chapter',)
list_filter = (
('board',RelatedDropdownFilter),
('grade', RelatedDropdownFilter),
('chapter', RelatedDropdownFilter),
我希望过滤器应该一个接一个地出现,并且应该包含最后选择的项目的过滤器列表。我理解,我只是举个例子 在简化形式中,它看起来像:
class Website(models.Model):
url = models.URLField(unique=True)
class Page(models.Model):
website = models.ForeignKey(
'Website',
on_delete=models.CASCADE,
related_name='pages'
)
url = models.URLField(max_length=2083)
title = models.CharField(max_length=255)
content = models.TextField()
我在admin.py中设置了一个管理面板,如下所示:
from django.contrib.admin import ModelAdmin
class WebsiteAdmin(AdminViews):
actions = [scrape_website]
list_display = ['url']
search_fields = ['url']
现在我想做的是在右边的边栏中添加一个过滤器。它将允许我按已删除/未删除状态筛选网站。我认为“scraped”是指一个网站在数据库中至少有一个页面,“notscraped”是指没有任何页面保存在数据库中的网站
这就是我们需要为Django管理员创建自定义过滤器的地方。像Django的许多事情一样,它非常简单,请按照我的手操作:
from django.contrib.admin import ModelAdmin, SimpleListFilter
class ScrapeStatusFilter(SimpleListFilter):
title = 'Scrape status' # a label for our filter
parameter_name = 'pages' # you can put anything here
def lookups(self, request, model_admin):
# This is where you create filter options; we have two:
return [
('scraped', 'Scraped'),
('not_scraped', 'Not scraped'),
]
def queryset(self, request, queryset):
# This is where you process parameters selected by use via filter options:
if self.value() == 'scraped':
# Get websites that have at least one page.
return queryset.distinct().filter(pages__isnull=False)
if self.value():
# Get websites that don't have any pages.
return queryset.distinct().filter(pages__isnull=True)
最后一步是将ScrapeStatusFilter添加到WebsiteAdmin:
class WebsiteAdmin(AdminViews):
actions = [scrape_website]
list_display = ['url']
search_fields = ['url']
list_filter = (ScrapeStatusFilter, )
应该是这样。现在,您可以通过定制的过滤器过滤网站列表