diff --git a/rest_framework/negotiation.py b/rest_framework/negotiation.py index b4bbfa1f54..95ec70bb82 100644 --- a/rest_framework/negotiation.py +++ b/rest_framework/negotiation.py @@ -2,7 +2,6 @@ Content negotiation deals with selecting an appropriate renderer given the incoming request. Typically this will be based on the request's Accept header. """ -from django.http import Http404 from rest_framework import exceptions from rest_framework.settings import api_settings @@ -85,7 +84,10 @@ def filter_renderers(self, renderers, format): renderers = [renderer for renderer in renderers if renderer.format == format] if not renderers: - raise Http404 + raise exceptions.NotAcceptable( + detail="Could not satisfy the request format suffix or query.", + available_renderers=renderers + ) return renderers def get_accept_list(self, request): diff --git a/tests/test_negotiation.py b/tests/test_negotiation.py index 089a86c624..fdb85e95c7 100644 --- a/tests/test_negotiation.py +++ b/tests/test_negotiation.py @@ -1,7 +1,7 @@ import pytest -from django.http import Http404 from django.test import TestCase +from rest_framework.exceptions import NotAcceptable from rest_framework.negotiation import ( BaseContentNegotiation, DefaultContentNegotiation ) @@ -81,7 +81,7 @@ def test_raise_error_if_no_suitable_renderers_found(self): class MockRenderer: format = 'xml' renderers = [MockRenderer()] - with pytest.raises(Http404): + with pytest.raises(NotAcceptable): self.negotiator.filter_renderers(renderers, format='json')