2016-05-17 2 views
0

Я использую django-filter и django-pure-pagination расширенияКак пройти QuerySet с исключением из параметров в расширении Джанго фильтра

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 модели имеют пустое значение цены. Я хочу исключить их из запроса. Как я могу это сделать?

ответ

0

Вы можете немного изменить свой 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 
+1

Есть ли смысл использовать FilterView в этом случае? –

+0

Не так, потому что вы явно определяете свои данные контекста в get_context_data(). Вместо этого вы можете использовать TemplateView. – ozren1983

+0

Похоже, что TemplateView не реализует MultipleObjectMixin, который используется для разбивки на страницы. Вы случайно не знаете, как сделать это с разбивкой на страницы? –

 Смежные вопросы

  • Нет связанных вопросов^_^