2016-05-10 9 views
1

Ich verwende django-filter. Ich habe Filterklasse:django übergeben zusätzliche Argumente zu filterset_class

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

und meine Ansichten:

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

Wie kann ich übergeben Argumente zu ProductFilter__init__ Funktion? filterset_class = ProductFilter(attribute='width') funktioniert nicht.

+0

Ist Attributwert immer Breite? wenn es sich ändert, woher bekommst du diesen Wert? ex: wie URL-Parameter – Pavan

+0

Nein, es ist nur ein Beispiel. Ich brauche diesen Wert von der cms-Seite, die in request.current_page ist. –

Antwort

2

könnten Sie versuchen, die get_filterset_kwargs Methode überschrieben:

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 

In Ihrem FilterSet Klasse, können Sie entweder das Attribut aus kwargs Pop:

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

oder explizit in der Signatur enthalten.

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

Wie bekomme ich Attribut in '__init__' Funktion? Ich habe diese Lösung versucht, aber in "__init__" gibt es kein Attribut in Kwargs. –

+0

Ich habe etwas durcheinander gebracht. Jetzt funktioniert es gut, danke. –

Verwandte Themen