Fixed #17582 - Added message to DoesNotExist exceptions.
Thanks simon@ for the suggestion and JordanPowell for the initial patch.
This commit is contained in:
parent
37ea9f9c03
commit
6f8627dd7f
|
@ -201,7 +201,9 @@ class SingleRelatedObjectDescriptor(six.with_metaclass(RenameRelatedObjectDescri
|
||||||
setattr(rel_obj, self.related.field.get_cache_name(), instance)
|
setattr(rel_obj, self.related.field.get_cache_name(), instance)
|
||||||
setattr(instance, self.cache_name, rel_obj)
|
setattr(instance, self.cache_name, rel_obj)
|
||||||
if rel_obj is None:
|
if rel_obj is None:
|
||||||
raise self.related.model.DoesNotExist
|
raise self.related.model.DoesNotExist("%s has no %s." % (
|
||||||
|
instance.__class__.__name__,
|
||||||
|
self.related.get_accessor_name()))
|
||||||
else:
|
else:
|
||||||
return rel_obj
|
return rel_obj
|
||||||
|
|
||||||
|
@ -304,7 +306,8 @@ class ReverseSingleRelatedObjectDescriptor(six.with_metaclass(RenameRelatedObjec
|
||||||
setattr(rel_obj, self.field.related.get_cache_name(), instance)
|
setattr(rel_obj, self.field.related.get_cache_name(), instance)
|
||||||
setattr(instance, self.cache_name, rel_obj)
|
setattr(instance, self.cache_name, rel_obj)
|
||||||
if rel_obj is None and not self.field.null:
|
if rel_obj is None and not self.field.null:
|
||||||
raise self.field.rel.to.DoesNotExist
|
raise self.field.rel.to.DoesNotExist(
|
||||||
|
"%s has no %s." % (self.field.model.__name__, self.field.name))
|
||||||
else:
|
else:
|
||||||
return rel_obj
|
return rel_obj
|
||||||
|
|
||||||
|
|
|
@ -277,6 +277,9 @@ Minor features
|
||||||
a ``SuspiciousOperation`` reaches the WSGI handler to return an
|
a ``SuspiciousOperation`` reaches the WSGI handler to return an
|
||||||
``HttpResponseBadRequest``.
|
``HttpResponseBadRequest``.
|
||||||
|
|
||||||
|
* The :exc:`~django.core.exceptions.DoesNotExist` exception now includes a
|
||||||
|
message indicating the name of the attribute used for the lookup.
|
||||||
|
|
||||||
Backwards incompatible changes in 1.6
|
Backwards incompatible changes in 1.6
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
|
|
|
@ -316,6 +316,11 @@ class MultiColumnFKTests(TestCase):
|
||||||
list(Article.objects.filter(active_translation__abstract=None)),
|
list(Article.objects.filter(active_translation__abstract=None)),
|
||||||
[a1, a2])
|
[a1, a2])
|
||||||
|
|
||||||
|
def test_foreign_key_raises_informative_does_not_exist(self):
|
||||||
|
referrer = ArticleTranslation()
|
||||||
|
with self.assertRaisesMessage(Article.DoesNotExist, 'ArticleTranslation has no article'):
|
||||||
|
referrer.article
|
||||||
|
|
||||||
class FormsTests(TestCase):
|
class FormsTests(TestCase):
|
||||||
# ForeignObjects should not have any form fields, currently the user needs
|
# ForeignObjects should not have any form fields, currently the user needs
|
||||||
# to manually deal with the foreignobject relation.
|
# to manually deal with the foreignobject relation.
|
||||||
|
|
|
@ -22,7 +22,8 @@ class OneToOneTests(TestCase):
|
||||||
# A Place can access its restaurant, if available.
|
# A Place can access its restaurant, if available.
|
||||||
self.assertEqual(repr(self.p1.restaurant), '<Restaurant: Demon Dogs the restaurant>')
|
self.assertEqual(repr(self.p1.restaurant), '<Restaurant: Demon Dogs the restaurant>')
|
||||||
# p2 doesn't have an associated restaurant.
|
# p2 doesn't have an associated restaurant.
|
||||||
self.assertRaises(Restaurant.DoesNotExist, getattr, self.p2, 'restaurant')
|
with self.assertRaisesMessage(Restaurant.DoesNotExist, 'Place has no restaurant'):
|
||||||
|
self.p2.restaurant
|
||||||
|
|
||||||
def test_setter(self):
|
def test_setter(self):
|
||||||
# Set the place using assignment notation. Because place is the primary
|
# Set the place using assignment notation. Because place is the primary
|
||||||
|
|
Loading…
Reference in New Issue