Skip to content

Commit 510210c

Browse files
author
Ryan P Kilby
committed
Fix #64
It's necessary to force form resolution before rendering. Otherwise `.qs` will cache an empty form - a result of no filters being requested.
1 parent f9ba5f5 commit 510210c

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

rest_framework_filters/backends.py

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

2+
from django.template import loader
3+
from rest_framework.compat import template_render
24
import rest_framework.filters
5+
36
from .filterset import FilterSet
47

58

@@ -15,3 +18,18 @@ def filter_queryset(self, request, queryset, view):
1518
return filter_class(request.query_params, queryset=queryset).qs
1619

1720
return queryset
21+
22+
def to_html(self, request, queryset, view):
23+
filter_class = self.get_filter_class(view, queryset)
24+
if not filter_class:
25+
return None
26+
filter_instance = filter_class(request.query_params, queryset=queryset)
27+
28+
# forces `form` evaluation before `qs` is called. This prevents an empty form from being cached.
29+
filter_instance.form
30+
31+
context = {
32+
'filter': filter_instance
33+
}
34+
template = loader.get_template(self.template)
35+
return template_render(template, context)

tests/settings.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
1+
2+
DEBUG = True
3+
14
DATABASES = {
25
'default': {
36
'ENGINE': 'django.db.backends.sqlite3',
4-
'NAME': ':memory:',
7+
'NAME': 'db.sqlite3',
8+
9+
'TEST': {
10+
'NAME': ':memory:',
11+
},
512
},
613
}
714

815
INSTALLED_APPS = (
916
'django.contrib.auth',
1017
'django.contrib.contenttypes',
18+
'django.contrib.staticfiles',
1119
'rest_framework',
1220
'tests.testapp',
1321
)
@@ -26,9 +34,12 @@
2634
'django.contrib.auth.context_processors.auth',
2735
'django.contrib.messages.context_processors.messages',
2836
],
37+
'debug': True,
2938
},
3039
},
3140
]
3241

3342

3443
ROOT_URLCONF = 'tests.testapp.urls'
44+
45+
STATIC_URL = '/static/'

tests/testapp/urls.py

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

22
from django.conf.urls import include, url
3-
from django.contrib import admin
43
from rest_framework import routers
54

65
from . import views
@@ -13,6 +12,5 @@
1312

1413

1514
urlpatterns = [
16-
url(r'^admin/', include(admin.site.urls)),
1715
url(r'^', include(router.urls)),
1816
]

0 commit comments

Comments
 (0)