Skip to content

Commit 4c1597e

Browse files
committed
Error modals
1 parent b996266 commit 4c1597e

File tree

3 files changed

+45
-3
lines changed

3 files changed

+45
-3
lines changed

rest_framework/renderers.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -683,15 +683,26 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
683683
self.accepted_media_type = accepted_media_type or ''
684684
self.renderer_context = renderer_context or {}
685685

686+
response = renderer_context['response']
687+
request = renderer_context['request']
688+
view = self.renderer_context['view']
689+
690+
if response.status_code == status.HTTP_400_BAD_REQUEST:
691+
# Errors still need to display the list or detail information.
692+
# The only way we can get at that is to simulate a GET request.
693+
self.error_form = self.get_rendered_html_form(data, view, request.method, request)
694+
self.error_title = {'POST': 'Create', 'PUT': 'Edit'}.get(request.method, 'Errors')
695+
696+
with override_method(view, request, 'GET') as request:
697+
response = view.get(request, *view.args, **view.kwargs)
698+
data = response.data
699+
686700
template = loader.get_template(self.template)
687701
context = self.get_context(data, accepted_media_type, renderer_context)
688702
context = RequestContext(renderer_context['request'], context)
689703
ret = template.render(context)
690704

691705
# Creation and deletion should use redirects in the admin style.
692-
response = renderer_context['response']
693-
request = renderer_context['request']
694-
695706
if (response.status_code == status.HTTP_201_CREATED) and ('Location' in response):
696707
response.status_code = status.HTTP_302_FOUND
697708
ret = ''
@@ -742,6 +753,8 @@ def get_context(self, data, accepted_media_type, renderer_context):
742753
context['columns'] = columns
743754
context['details'] = details
744755
context['results'] = results
756+
context['error_form'] = getattr(self, 'error_form', None)
757+
context['error_title'] = getattr(self, 'error_title', None)
745758
return context
746759

747760

rest_framework/static/rest_framework/js/default.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,7 @@ if (selectedTab && selectedTab.length > 0) {
5959
// If no tab selected, display rightmost tab.
6060
$('.form-switcher a:first').tab('show');
6161
}
62+
63+
$(window).load(function(){
64+
$('#errorModal').modal('show');
65+
});

rest_framework/templates/rest_framework/admin.html

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,31 @@ <h4 class="modal-title" id="myModalLabel">Edit</h4>
196196
</div>
197197
</div>
198198

199+
{% if error_form %}
200+
<!-- Errors Modal -->
201+
<div class="modal" id="errorModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
202+
<div class="modal-dialog">
203+
<div class="modal-content">
204+
<div class="modal-header">
205+
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
206+
<h4 class="modal-title" id="myModalLabel">{{ error_title }}</h4>
207+
</div>
208+
<form action="{{ request.get_full_path }}" method="POST" enctype="multipart/form-data" class="form-horizontal" novalidate>
209+
<div class="modal-body">
210+
<fieldset>
211+
{{ error_form }}
212+
</fieldset>
213+
</div>
214+
<div class="modal-footer">
215+
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
216+
<button name="{{ api_settings.FORM_METHOD_OVERRIDE }}" value="{{ request.method }}" type="submit" class="btn btn-primary">Save</button>
217+
</div>
218+
</form>
219+
</div>
220+
</div>
221+
</div>
222+
{% endif %}
223+
199224
{% block script %}
200225
<script src="{% static "rest_framework/js/jquery-1.8.1-min.js" %}"></script>
201226
<script src="{% static "rest_framework/js/bootstrap.min.js" %}"></script>

0 commit comments

Comments
 (0)