Skip to content

Commit 1998540

Browse files
author
Ryan P Kilby
authored
Fix backend template rendering (#129)
* Update to_html
1 parent 385c61c commit 1998540

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

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+
})

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+
""")

0 commit comments

Comments
 (0)