20
20
from .utils import try_dbfield , get_all_model_fields , get_model_field , resolve_field
21
21
22
22
23
- def get_declared_filters (bases , attrs , with_base_filters = True ):
24
- filters = []
25
- for filter_name , obj in list (attrs .items ()):
26
- if isinstance (obj , Filter ):
27
- obj = attrs .pop (filter_name )
28
- if getattr (obj , 'name' , None ) is None :
29
- obj .name = filter_name
30
- filters .append ((filter_name , obj ))
31
- filters .sort (key = lambda x : x [1 ].creation_counter )
32
-
33
- if with_base_filters :
34
- for base in bases [::- 1 ]:
35
- if hasattr (base , 'base_filters' ):
36
- filters = list (base .base_filters .items ()) + filters
37
- else :
38
- for base in bases [::- 1 ]:
39
- if hasattr (base , 'declared_filters' ):
40
- filters = list (base .declared_filters .items ()) + filters
41
-
42
- return OrderedDict (filters )
43
-
44
-
45
23
def filters_for_model (model , fields = None , exclude = None , filter_for_field = None ,
46
24
filter_for_reverse_field = None ):
47
25
field_dict = OrderedDict ()
@@ -138,7 +116,7 @@ def __new__(cls, name, bases, attrs):
138
116
except NameError :
139
117
# We are defining FilterSet itself here
140
118
parents = None
141
- declared_filters = get_declared_filters (bases , attrs , False )
119
+ declared_filters = cls . get_declared_filters (bases , attrs )
142
120
new_class = super (
143
121
FilterSetMetaclass , cls ).__new__ (cls , name , bases , attrs )
144
122
@@ -163,6 +141,28 @@ def __new__(cls, name, bases, attrs):
163
141
new_class .base_filters = filters
164
142
return new_class
165
143
144
+ @classmethod
145
+ def get_declared_filters (cls , bases , attrs ):
146
+ filters = [
147
+ (filter_name , attrs .pop (filter_name ))
148
+ for filter_name , obj in list (attrs .items ())
149
+ if isinstance (obj , Filter )
150
+ ]
151
+
152
+ # Default the `filter.name` to the attribute name on the filterset
153
+ for filter_name , f in filters :
154
+ if getattr (f , 'name' , None ) is None :
155
+ f .name = filter_name
156
+
157
+ filters .sort (key = lambda x : x [1 ].creation_counter )
158
+
159
+ # merge declared filters from base classes
160
+ for base in reversed (bases ):
161
+ if hasattr (base , 'declared_filters' ):
162
+ filters = list (base .declared_filters .items ()) + filters
163
+
164
+ return OrderedDict (filters )
165
+
166
166
167
167
FILTER_FOR_DBFIELD_DEFAULTS = {
168
168
models .AutoField : {'filter_class' : NumberFilter },
0 commit comments