Skip to content

Commit

Permalink
add choices extraction for declared fields with tests ... addresses i…
Browse files Browse the repository at this point in the history
  • Loading branch information
nkryptic committed Jan 21, 2013
1 parent 136dfb8 commit cab2795
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 3 deletions.
13 changes: 10 additions & 3 deletions django_filters/filterset.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
from django.db.models.sql.constants import LOOKUP_SEP

from django_filters.filters import Filter, CharFilter, BooleanFilter, \
ChoiceFilter, DateFilter, DateTimeFilter, TimeFilter, ModelChoiceFilter, \
ModelMultipleChoiceFilter, NumberFilter
ChoiceFilter, MultipleChoiceFilter, DateFilter, DateTimeFilter, \
TimeFilter, ModelChoiceFilter, ModelMultipleChoiceFilter, NumberFilter


ORDER_BY_FIELD = 'o'
Expand Down Expand Up @@ -225,8 +225,15 @@ def __init__(self, data=None, queryset=None, prefix=None):

self.filters = deepcopy(self.base_filters)
# propagate the model being used through the filters
for filter_ in self.filters.values():
for name_, filter_ in self.filters.items():
filter_.model = self._meta.model
# add choices to declared filters that don't have them defined
if name_ in self.declared_filters:
if isinstance(filter_, (ChoiceFilter, MultipleChoiceFilter,
ModelChoiceFilter, ModelMultipleChoiceFilter)):
if 'choices' not in filter_.extra:
field = get_model_field(self._meta.model, filter_.name)
filter_.extra['choices'] = field.choices

def __iter__(self):
for obj in self.qs:
Expand Down
23 changes: 23 additions & 0 deletions django_filters/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,29 @@ class Meta:
<li><a class="selected" href="?status=1">Admin</a></li>
</ul></td></tr>""")

def test_choice_filter_with_inherited_choices(self):
class F(FilterSet):
status = ChoiceFilter()

class Meta:
model = User
fields = ['status']

f = F()
self.assertEqual(f.form.fields['status'].choices,
[(0, 'Regular'), (1, 'Admin')])

class F(FilterSet):
status = ChoiceFilter(name='author__status')

class Meta:
model = Comment
fields = ['status']

f = F()
self.assertEqual(f.form.fields['status'].choices,
[(0, 'Regular'), (1, 'Admin')])

def test_http_mapping(self):
class F(FilterSet):
class Meta:
Expand Down

0 comments on commit cab2795

Please sign in to comment.