2016-05-10 3 views
1

Я использую django-filter. У меня есть класс фильтра:django передать дополнительные аргументы в filterset_class

class ProductFilter(django_filters.FilterSet): 
    def __init__(self, attribute=None, *args, **kwargs): 
     super(ProductFilter, self).__init__(*args, **kwargs) 
     #do stuff with attribute 

и мои взгляды:

from django_filters.views import FilterView 
class ProductListView(FilterView): 
     model = Product 
     .... 
     filterset_class = ProductFilter 

Как я могу передать аргументы ProductFilter__init__ функции? filterset_class = ProductFilter(attribute='width') не работает.

+0

Является ли значение атрибута всегда шириной? если он изменится, откуда вы получаете это значение? ex: как параметры URL – Pavan

+0

Нет, это просто пример. Мне нужно это значение, чтобы перейти с страницы cms, которая находится в request.current_page. –

ответ

2

Вы можете попробовать переопределить метод get_filterset_kwargs:

class ProductListView(FilterView): 
    model = Product 
    ... 
    filterset_class = ProductFilter 

    def get_filterset_kwargs(self, filterset_class) 
     kwargs = super(ProductListView, self).get_filterset_kwargs(filterset_class) 
     kwargs['attribute'] = 'width' 
     return kwargs 

В вашем FilterSet классе, вы можете либо поп атрибут из kwargs:

class ProductFilter(django_filters.FilterSet): 
    def __init__(self, **kwargs): 
     attribute = kwargs.pop['attribute'] 
     super(ProductFilter, self).__init__(**kwargs) 

Или явно включить его в подписи.

class ProductFilter(django_filters.FilterSet): 
    def __init__(self, attribute=None, **kwargs): 
     super(ProductFilter, self).__init__(**kwargs) 
+0

Как получить атрибут в функции '__init__'? Я пробовал это решение, но в '__init__' нет атрибута в kwargs. –

+0

У меня что-то испортилось. Спасибо, спасибо. –

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