简体   繁体   English

使用下拉列表使用django-filters过滤django-tables2表

[英]Filtering a django-tables2 table with django-filters using a drop down list

I have a model (Brief) that i am showing in a list with Django-tables2. 我有一个要在Django-tables2列表中显示的模型(简短)。 A Brief can belong to one or many towers. 简介可以属于一个或多个塔。 I am trying to create a view where a user can see all briefs, and then filter to find briefs related to a specific tower. 我正在尝试创建一个视图,用户可以在其中查看所有摘要,然后进行筛选以查找与特定塔楼相关的摘要。 I had first implemented this using check boxes, and it was working, but I need to get that filter into a drop down list. 我首先使用复选框实现了此功能,并且可以正常工作,但是我需要将该过滤器放入下拉列表中。

"GET /brief/?towers= HTTP/1.1" - Gives me all the briefs. “ GET / brief /?towers = HTTP / 1.1”-给我所有的摘要。 "GET /brief/?towers=1 HTTP/1.1" - Gives an empty list of briefs.(should give me 2 in my test data) Querying in django shell gives me the results I would expect. “ GET / brief /?towers = 1 HTTP / 1.1”-给出一个简短的摘要列表。(应该在测试数据中给我2个)在django shell中进行查询可以得到预期的结果。

Another odd behavior is that my drop down list has spaces that can be selected. 另一个奇怪的行为是我的下拉列表中有可以选择的空格。

class Attribute(models.Model):

    class Meta:
        abstract = True
        ordering = ['name']

    name = models.CharField(max_length=100, unique=True)
    created_on = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(User, related_name='% 
       (class)s_created_by', null=True, blank=True, 
           on_delete=models.SET_NULL)
    modified_dt = models.DateTimeField(auto_now=True)
    modified_by = models.ForeignKey(User, related_name='% 
       (class)s_modified_by', null=True, blank=True, 
           on_delete=models.SET_NULL)

    def __str__(self):
        return self.name


class Tower(Attribute):
    pass


class Brief (Attribute):
   link = models.URLField()
   sources = models.ManyToManyField(SourceSystem)
   format = models.ForeignKey(ReportFormat, on_delete=models.PROTECT)
   towers = models.ManyToManyField(Tower)
   type = models.ForeignKey(ReportType, on_delete=models.PROTECT)
   project = models.ForeignKey(Project, on_delete=models.PROTECT)

   def tower_list(self):
      return ", ".join([str(obj) for obj in self.towers.all()])

   def source_list(self):
      return ", ".join([str(obj) for obj in self.sources.all()])

My tables.py: 我的tables.py:

class BriefTable(tables.Table):
    name = tables.LinkColumn('brief_detail', args=[A('pk')])

    class Meta:
        model = Brief
        template_name = 'django_tables2/bootstrap.html'
        sequence = ('id', 'name', 'type', 'project', 'format',)
        exclude = ('link', 'created_on', 'created_by', 'modified_dt', 'modified_by', 'info')

My filters.py 我的filters.py

class BriefFilter(django_filters.FilterSet):
    towers=django_filters.ModelMultipleChoiceFilter(
        queryset=Tower.objects.all(), widget=forms.Select)
    class Meta:
        model = Brief
        fields = ['towers']

my view: 我的观点:

class FilteredBriefListView(LoginRequiredMixin, SingleTableMixin, 
    FilterView):
    table_class = BriefTable
    template_name = 'brief/brief_list.html'
    paginate_by = 20
    filterset_class = BriefFilter

finally my route: 终于我的路线:

urlpatterns = [
    path('', FilteredBriefListView.as_view(), name="home"),
]

休息片刻后,我意识到我正在使用ModelMultipleChoiceFilter而不是ModelChoiceFilter ... / facepalm。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM