Skip to content

Commit f74185b

Browse files
authored
Fix get_template_context to handle also lists (#9467)
1 parent ccfe0a9 commit f74185b

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

rest_framework/renderers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,10 @@ def resolve_template(self, template_names):
171171

172172
def get_template_context(self, data, renderer_context):
173173
response = renderer_context['response']
174+
# in case a ValidationError is caught the data parameter may be a list
175+
# see rest_framework.views.exception_handler
176+
if isinstance(data, list):
177+
return {'details': data, 'status_code': response.status_code}
174178
if response.exception:
175179
data['status_code'] = response.status_code
176180
return data

tests/test_htmlrenderer.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from rest_framework import status
1010
from rest_framework.decorators import api_view, renderer_classes
11+
from rest_framework.exceptions import ValidationError
1112
from rest_framework.renderers import TemplateHTMLRenderer
1213
from rest_framework.response import Response
1314

@@ -34,10 +35,17 @@ def not_found(request):
3435
raise Http404()
3536

3637

38+
@api_view(('GET',))
39+
@renderer_classes((TemplateHTMLRenderer,))
40+
def validation_error(request):
41+
raise ValidationError('error')
42+
43+
3744
urlpatterns = [
3845
path('', example),
3946
path('permission_denied', permission_denied),
4047
path('not_found', not_found),
48+
path('validation_error', validation_error),
4149
]
4250

4351

@@ -91,6 +99,12 @@ def test_permission_denied_html_view(self):
9199
self.assertEqual(response.content, b"403 Forbidden")
92100
self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8')
93101

102+
def test_validation_error_html_view(self):
103+
response = self.client.get('/validation_error')
104+
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
105+
self.assertEqual(response.content, b"400 Bad Request")
106+
self.assertEqual(response['Content-Type'], 'text/html; charset=utf-8')
107+
94108
# 2 tests below are based on order of if statements in corresponding method
95109
# of TemplateHTMLRenderer
96110
def test_get_template_names_returns_own_template_name(self):

0 commit comments

Comments
 (0)