Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django管理仪表板中构建链接过滤器_Python_Django_Filter_Django Admin_Django Filter - Fatal编程技术网

Python 如何在django管理仪表板中构建链接过滤器

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)

我想在django管理仪表板链式过滤器,请帮助我实现它。 我有3种型号:- 黑板、年级和章节。 最初,当仪表板加载时,应仅显示板过滤器,选择板过滤器后,应显示所选板所有过滤器,选择等级后,应显示该等级的所有章节

我试过RelatedDropdownFilter但这很正常, 它不修改dropdownfilter的视图部分,而是显示所有结果

我的模型:-

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, )
应该是这样。现在,您可以通过定制的过滤器过滤网站列表