Как передать набор запросов с параметром exclude в расширении django-filter

Я использую django-filter и django-pure-pagination расширения

class BuyFilterView(PaginationMixin, FilterView):
    filterset_class = ProductFilter
    template_name = "buy_filter.html"
    context_object_name = "goods"
    paginate_by = 50

    def get_context_data(self, **kwargs):
        context = super(BuyFilterView, self).get_context_data(**kwargs)
        context['cart'] = Cart.objects.get(user=self.request.user)
        return context


class ProductFilter(FilterSet):
    country = ChoiceFilter(choices=country_values)
    brand = ChoiceFilter(choices=brand_values)
    type = ChoiceFilter(choices=type_values)

    class Meta:
        model = Goods
        fields = {
            'country': ['exact'],
            'brand': ['exact'],
            'type': ['exact'],
        }

Некоторые товары в модели Goods имеют пустое значение цены. Я хочу исключить их из набора запросов. Как я могу это сделать?


person Михаил Павлов    schedule 17.05.2016    source источник


Ответы (1)


Вы можете немного изменить свой BuyFilterView и get_context_data(), чтобы явно вызывать ProductFilter и использовать комбинацию MultipleObjectMixin и TemplateView:

class BuyFilterView(PaginationMixin, MultipleObjectMixin, TemplateView):
    template_name = "buy_filter.html"
    paginate_by = 50

    def get_context_data(self, **kwargs):
        context = super(BuyFilterView, self).get_context_data(**kwargs)
        context['cart'] = Cart.objects.get(user=self.request.user)
        context['goods'] = ProductFilter(request.GET,
                                         queryset=Goods.objects.exclude(price=''))
        return context

Другой, может быть, даже более чистый вариант — использовать ListView и переопределить его метод get_queryset():

class BuyFilterView(PaginationMixin, ListView):
    template_name = "buy_filter.html"
    paginate_by = 50

    def get_queryset(self):
        return ProductFilter(self.request.GET, queryset=Goods.objects.exclude(price=''))

    def get_context_data(self, **kwargs):
        context = super(BuyFilterView, self).get_context_data(**kwargs)
        context['cart'] = Cart.objects.get(user=self.request.user)
        return context
person ozren1983    schedule 17.05.2016
comment
Не совсем, так как вы явно определяете свои контекстные данные в get_context_data(). Вместо этого вы можете использовать TemplateView. - person ozren1983; 18.05.2016
comment
Похоже, что TemplateView не реализует MultipleObjectMixin, который используется для разбиения на страницы. Вы случайно не знаете, как сделать это с нумерацией страниц? - person Михаил Павлов; 18.05.2016
comment
Хорошо, вы можете либо добавить MultipleObjectMixin, либо использовать ListView вместо TemplateView и переопределить его метод get_queryset(). Смотрите мой обновленный ответ. - person ozren1983; 18.05.2016
comment
Наконец-то заработало с FilterView. Мне нужно, чтобы форма была встроена в объект фильтра. По какой-то причине пришлось установить параметр model FilterView, хотя он объявлен в классе Meta моего фильтра. Спасибо за вашу помощь. - person Михаил Павлов; 19.05.2016