diff options
| author | krishbharadwaj <krishna.bmsce@gmail.com> | 2016-04-23 23:05:18 +0530 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-06-08 17:20:03 -0400 |
| commit | f6681393d3f53a67b4e0645e8d02f95579d8ae2d (patch) | |
| tree | e948ad4c71febd776f62a1260f2038066c91fcc8 /django/contrib | |
| parent | c8d2120b06e1b82cb0db896aa0f9767b2f14256c (diff) | |
Fixing #26524 -- Made a foreign key id reference in ModelAdmin.list_display display the id.
Diffstat (limited to 'django/contrib')
| -rw-r--r-- | django/contrib/admin/utils.py | 18 | ||||
| -rw-r--r-- | django/contrib/admin/views/main.py | 3 |
2 files changed, 19 insertions, 2 deletions
diff --git a/django/contrib/admin/utils.py b/django/contrib/admin/utils.py index 15dca40dc4..3a9a28fd3f 100644 --- a/django/contrib/admin/utils.py +++ b/django/contrib/admin/utils.py @@ -19,6 +19,11 @@ from django.utils.text import capfirst from django.utils.translation import ungettext +class FieldIsAForeignKeyColumnName(Exception): + """A field is a foreign key attname, i.e. <FK>_id.""" + pass + + def lookup_needs_distinct(opts, lookup_path): """ Returns True if 'distinct()' should be used to query the given lookup path. @@ -272,7 +277,7 @@ def lookup_field(name, obj, model_admin=None): opts = obj._meta try: f = _get_non_gfk_field(opts, name) - except FieldDoesNotExist: + except (FieldDoesNotExist, FieldIsAForeignKeyColumnName): # For non-field values, the value is either a method, property or # returned via a callable. if callable(name): @@ -310,6 +315,11 @@ def _get_non_gfk_field(opts, name): # Generic foreign keys OR reverse relations ((field.many_to_one and not field.related_model) or field.one_to_many)): raise FieldDoesNotExist() + + # Avoid coercing <FK>_id fields to FK + if field.is_relation and hasattr(field, 'attname') and field.attname == name: + raise FieldIsAForeignKeyColumnName() + return field @@ -362,6 +372,10 @@ def label_for_field(name, model, model_admin=None, return_attr=False): label = pretty_name(attr.__name__) else: label = pretty_name(name) + except FieldIsAForeignKeyColumnName: + label = pretty_name(name) + attr = name + if return_attr: return (label, attr) else: @@ -372,7 +386,7 @@ def help_text_for_field(name, model): help_text = "" try: field = _get_non_gfk_field(model._meta, name) - except FieldDoesNotExist: + except (FieldDoesNotExist, FieldIsAForeignKeyColumnName): pass else: if hasattr(field, 'help_text'): diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py index 081488efb5..cf392e418f 100644 --- a/django/contrib/admin/views/main.py +++ b/django/contrib/admin/views/main.py @@ -371,6 +371,9 @@ class ChangeList(object): pass else: if isinstance(field.remote_field, models.ManyToOneRel): + # <FK>_id field names don't require a join. + if field_name == field.get_attname(): + continue return True return False |
