Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

[1.0.X] Fixed #8248: made help() work on models and improved introspe…

…ction support.

  
Descriptors now return themselves when accessed via the class, as per standard
Python descriptors like property().

Backported from r9550 and also r9562 and r9563


git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@9634 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 24a1900b3699fe883b027cfacfd7fe9ff117491f 1 parent c9a6c06
Luke Plant spookylukey authored
2  django/contrib/admin/validation.py
View
@@ -36,6 +36,8 @@ def validate(cls, model):
except models.FieldDoesNotExist:
raise ImproperlyConfigured("%s.list_display[%d], %r is not a callable or an attribute of %r or found in the model %r."
% (cls.__name__, idx, field, cls.__name__, model._meta.object_name))
+ else:
+ # getattr(model, field) could be an X_RelatedObjectsDescriptor
f = fetch_attr(cls, model, opts, "list_display[%d]" % idx, field)
if isinstance(f, models.ManyToManyField):
raise ImproperlyConfigured("'%s.list_display[%d]', '%s' is a ManyToManyField which is not supported."
4 django/contrib/contenttypes/generic.py
View
@@ -59,7 +59,7 @@ def get_content_type(self, obj=None, id=None):
def __get__(self, instance, instance_type=None):
if instance is None:
- raise AttributeError, u"%s must be accessed via instance" % self.name
+ return self
try:
return getattr(instance, self.cache_attr)
@@ -183,7 +183,7 @@ def __init__(self, field):
def __get__(self, instance, instance_type=None):
if instance is None:
- raise AttributeError, "Manager must be accessed via instance"
+ return self
# This import is done here to avoid circular import importing this module
from django.contrib.contenttypes.models import ContentType
10 django/db/models/fields/related.py
View
@@ -175,7 +175,7 @@ def __init__(self, related):
def __get__(self, instance, instance_type=None):
if instance is None:
- raise AttributeError, "%s must be accessed via instance" % self.related.opts.object_name
+ return self
try:
return getattr(instance, self.cache_name)
@@ -223,7 +223,7 @@ def __init__(self, field_with_rel):
def __get__(self, instance, instance_type=None):
if instance is None:
- raise AttributeError, "%s must be accessed via instance" % self.field.name
+ return self
cache_name = self.field.get_cache_name()
try:
return getattr(instance, cache_name)
@@ -287,7 +287,7 @@ def __init__(self, related):
def __get__(self, instance, instance_type=None):
if instance is None:
- raise AttributeError, "Manager must be accessed via instance"
+ return self
rel_field = self.related.field
rel_model = self.related.model
@@ -500,7 +500,7 @@ def __init__(self, related):
def __get__(self, instance, instance_type=None):
if instance is None:
- raise AttributeError, "Manager must be accessed via instance"
+ return self
# Dynamically create a class that subclasses the related
# model's default manager.
@@ -545,7 +545,7 @@ def __init__(self, m2m_field):
def __get__(self, instance, instance_type=None):
if instance is None:
- raise AttributeError, "Manager must be accessed via instance"
+ return self
# Dynamically create a class that subclasses the related
# model's default manager.
Please sign in to comment.
Something went wrong with that request. Please try again.