Skip to content

Commit 46ead91

Browse files
author
Ryan P Kilby
authored
Merge pull request #141 from rpkilby/0.9.x
0.9.1 backports
2 parents 0a95a65 + 248a647 commit 46ead91

File tree

5 files changed

+54
-7
lines changed

5 files changed

+54
-7
lines changed

CHANGELOG.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
Unreleased:
22
-----------
33

4+
v0.9.1:
5+
-------
6+
7+
* #128 Fix all lookups handling for related fields
8+
* #129 Fix backend template rendering
9+
410
v0.9.0:
511
-------
612

rest_framework_filters/backends.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
from django.template import loader
2+
from django.template import Template, TemplateDoesNotExist, loader
33
from rest_framework import compat
44
from django_filters.rest_framework import backends
55

@@ -28,8 +28,11 @@ def to_html(self, request, queryset, view):
2828
# forces `form` evaluation before `qs` is called. This prevents an empty form from being cached.
2929
filter_instance.form
3030

31-
context = {
31+
try:
32+
template = loader.get_template(self.template)
33+
except TemplateDoesNotExist:
34+
template = Template(backends.template_default)
35+
36+
return compat.template_render(template, context={
3237
'filter': filter_instance
33-
}
34-
template = loader.get_template(self.template)
35-
return compat.template_render(template, context)
38+
})

rest_framework_filters/filterset.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from django.utils import six
1010

1111
from django_filters import filterset, rest_framework
12+
from django_filters.utils import get_model_field
1213

1314
from . import filters
1415
from . import utils
@@ -139,7 +140,7 @@ def filters_for_model(cls, model, opts):
139140
lookups = '__all__'
140141

141142
if lookups == '__all__':
142-
field = model._meta.get_field(name)
143+
field = get_model_field(model, name)
143144
fields[name] = utils.lookups_for_field(field)
144145

145146
return filterset.filters_for_model(

tests/test_backends.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11

2-
from rest_framework.test import APITestCase
2+
from rest_framework.test import APITestCase, APIRequestFactory
33

44
from .testapp import models, views
55

6+
factory = APIRequestFactory()
7+
68

79
class BackendTest(APITestCase):
810

@@ -33,3 +35,27 @@ def test_filter_fields_reusability(self):
3335
self.assertEqual(len(response.data), 1)
3436
self.assertEqual(response.data[0]['username'], 'user1')
3537
self.assertDictEqual(views.FilterFieldsUserViewSet.filter_fields, {'username': '__all__'})
38+
39+
def test_backend_output_sanity(self):
40+
"""
41+
Sanity check to ensure backend can at least render something without crashing.
42+
"""
43+
class SimpleViewSet(views.FilterFieldsUserViewSet):
44+
filter_fields = ['username']
45+
46+
view = SimpleViewSet(action_map={})
47+
backend = view.filter_backends[0]
48+
request = view.initialize_request(factory.get('/'))
49+
html = backend().to_html(request, view.get_queryset(), view)
50+
51+
self.assertHTMLEqual(html, """
52+
<h2>Field filters</h2>
53+
<form class="form" action="" method="get">
54+
<p>
55+
<label for="id_username">Username:</label>
56+
<input id="id_username" name="username" type="text" />
57+
<span class="helptext">Filter</span>
58+
</p>
59+
<button type="submit" class="btn btn-primary">Submit</button>
60+
</form>
61+
""")

tests/test_filterset.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,17 @@ class Meta:
6363
self.assertIsInstance(F.base_filters['author'], filters.ModelChoiceFilter)
6464
self.assertIsInstance(F.base_filters['author__in'], BaseInFilter)
6565

66+
def test_alllookupsfilter_for_related_field(self):
67+
# See: https://github.com/philipn/django-rest-framework-filters/issues/127
68+
class F(FilterSet):
69+
author = filters.AllLookupsFilter(name='author__last_name')
70+
71+
class Meta:
72+
model = Note
73+
74+
self.assertIsInstance(F.base_filters['author'], filters.CharFilter)
75+
self.assertEqual(F.base_filters['author'].name, 'author__last_name')
76+
6677
def test_relatedfilter_combined_with__all__(self):
6778
# ensure that related filter is compatible with __all__ lookups.
6879
class F(FilterSet):

0 commit comments

Comments
 (0)