【问题标题】:How to search with django_tables2 when using filters使用过滤器时如何使用 django_tables2 进行搜索
【发布时间】:2019-09-22 00:39:40
【问题描述】:

我的问题是过滤后我无法取回任何数据。 我的搜索字段是:id name 和 surname。最后两个取自客户端,是外键。

filters.py

class OrderFilter(django_filters.FilterSet):
    client__name = django_filters.CharFilter(lookup_expr='icontains')
    client__surname = django_filters.CharFilter(lookup_expr='icontains')

    class Meta:
        model = Order
        fields = ['id']

models.py

class Order(models.Model):
    client = models.ForeignKey(Client,verbose_name=u'Client')

tables.py

class OrderTable(tables.Table):

    #CUSTOM COLUMN EXAMPLE
    order_id=tables.Column(verbose_name= 'ID Order',orderable=False,empty_values=())

class Meta:
        #define the model
        model = Order
        exclude=('id')
        template_name = 'django_tables2/bootstrap.html'
        sequence = ("order_id")

views.py

class OrderListView(SingleTableMixin,FilterView):
    table_class = OrderTable
    model = Order
    template_name='orders/orde_list.html'
    filterset_class = OrderFilter

    def get_context_data(self, **kwargs):
        context = super(OrderListView, self).get_context_data(**kwargs)
        ##filter the orders of the past 4 months.
        last_four_months=date.today() - timedelta(120)
        object_list=Order.objects.filter(order_created__gte=last_four_months,ays=1).order_by('-invoice_date')
        table=self.table_class(object_list)
        RequestConfig(self.request).configure(table)
        context['table'] = table
        #clear all fields
        has_filter = any(field in self.request.GET for field in set(self.filterset_class.get_fields()))
        context['has_filter'] = has_filter
        return context

我注意到,当我创建一个自定义查询集来填充我的表时,例如:object_list=Order.objects.filter(order_created__gte=last_four_months).order_by('-invoice_date') 过滤不起作用。

当我什么都不放时,它可以正常工作。

知道为什么会这样吗?

【问题讨论】:

    标签: filter filtering django-tables2


    【解决方案1】:

    问题是我没有定义我的自定义查询集必须插入自定义表(tables.py)中,更重要的是要被自定义过滤器(filters.py)过滤。

    在这样做之后,自定义查询集正确过滤。

    class OrderAYSListView(LoginRequiredMixin,SingleTableMixin,FilterView):
        login_url = '/login/'
        table_class = OrderTable2
        model = Order
        template_name='orders/order_ays_list.html'
        filterset_class = OrderFilter
    
        def get_context_data(self, **kwargs):
            context = super(OrderAYSListView, self).get_context_data(**kwargs)
            ##filter the orders of the past 4 months.
            last_four_months=date.today() - timedelta(120)
            object_list=Order.objects.filter(order_created__gte=last_four_months,ays=1).order_by('-invoice_date')
    
            f = self.filterset_class(self.request.GET, queryset=object_list)
            context['filter'] = f
            table = self.table_class(f.qs)
            RequestConfig(self.request).configure(table)
            context['table'] = table
            #clear all fields
            has_filter = any(field in self.request.GET for field in set(self.filterset_class.get_fields()))
            context['has_filter'] = has_filter
            return context
    

    【讨论】:

      猜你喜欢
      • 2019-07-14
      • 2019-04-25
      • 2020-03-06
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2012-12-16
      • 1970-01-01
      相关资源
      最近更新 更多