[1.0.X] Fixed #8248: made help() work on models and improved introspection 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
This commit is contained in:
Luke Plant 2008-12-10 00:14:56 +00:00
parent c9a6c06de8
commit 24a1900b36
3 changed files with 9 additions and 7 deletions

View File

@ -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."

View File

@ -59,7 +59,7 @@ class GenericForeignKey(object):
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 @@ class ReverseGenericRelatedObjectsDescriptor(object):
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

View File

@ -175,7 +175,7 @@ class SingleRelatedObjectDescriptor(object):
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 @@ class ReverseSingleRelatedObjectDescriptor(object):
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 @@ class ForeignRelatedObjectsDescriptor(object):
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 @@ class ManyRelatedObjectsDescriptor(object):
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 @@ class ReverseManyRelatedObjectsDescriptor(object):
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.