Как искать с django_tables2 при использовании фильтров - PullRequest
0 голосов
/ 03 мая 2019

Моя проблема в том, что я не могу вернуть данные после фильтрации. Мои поля поиска: имя и фамилия. Последние два взяты у Клиента, который является внешним ключом.

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') фильтрация не работает.

Когда я ничего не ставлю, он работает правильно.

Есть идеи, почему это происходит?

1 Ответ

0 голосов
/ 04 мая 2019

Проблема заключалась в том, что я не определил, что мой пользовательский набор запросов должен быть вставлен в пользовательскую таблицу (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
...