Skip to content
Browse files

Fixed #2301 -- Added list_display_links option to 'class Admin', whic…

…h regulates which fields in the change list have links. Thanks, kilian

git-svn-id: bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
1 parent 5ce4a56 commit c1847294b8c1b97993a945d43e50c56c0486ceed @adrianholovaty adrianholovaty committed
Showing with 45 additions and 2 deletions.
  1. +1 −0 AUTHORS
  2. +2 −1 django/contrib/admin/templatetags/
  3. +13 −0 django/core/
  4. +2 −1 django/db/models/
  5. +27 −0 docs/model-api.txt
@@ -72,6 +72,7 @@ answer newbie questions, and generally made Django that much better:
Russell Keith-Magee <>
Garth Kidd <>
+ kilian <>
Sune Kirkeby <>
Cameron Knight (ckknight)
Bruce Kroeze <>
3 django/contrib/admin/templatetags/
@@ -165,7 +165,8 @@ def items_for_result(cl, result):
result_repr = escape(str(field_val))
if result_repr == '':
result_repr = '&nbsp;'
- if first: # First column is a special case
+ # If list_display_links not defined, add the link tag to the first field
+ if (first and not cl.lookup_opts.admin.list_display_links) or field_name in cl.lookup_opts.admin.list_display_links:
first = False
url = cl.url_for_result(result)
result_id = str(getattr(result, pk)) # str() is needed in case of 23L (long ints)
13 django/core/
@@ -936,6 +936,19 @@ def get_validation_errors(outfile, app=None):
if isinstance(f, models.ManyToManyField):
e.add(opts, '"admin.list_display" doesn\'t support ManyToManyFields (%r).' % fn)
+ # list_display_links
+ if opts.admin.list_display_links and not opts.admin.list_display:
+ e.add(opts, '"admin.list_display" must be defined for "admin.list_display_links" to be used.')
+ if not isinstance(opts.admin.list_display_links, (list, tuple)):
+ e.add(opts, '"admin.list_display_links", if given, must be set to a list or tuple.')
+ else:
+ for fn in opts.admin.list_display_links:
+ try:
+ f = opts.get_field(fn)
+ except models.FieldDoesNotExist:
+ e.add(opts, '"admin.list_filter" refers to %r, which isn\'t a field.' % fn)
+ if fn not in opts.admin.list_display:
+ e.add(opts, '"admin.list_display_links" refers to %r, which is not defined in "admin.list_display".' % fn)
# list_filter
if not isinstance(opts.admin.list_filter, (list, tuple)):
e.add(opts, '"admin.list_filter", if given, must be set to a list or tuple.')
3 django/db/models/
@@ -199,12 +199,13 @@ def has_field_type(self, field_type, follow=None):
return self._field_types[field_type]
class AdminOptions(object):
- def __init__(self, fields=None, js=None, list_display=None, list_filter=None,
+ def __init__(self, fields=None, js=None, list_display=None, list_display_links=None, list_filter=None,
date_hierarchy=None, save_as=False, ordering=None, search_fields=None,
save_on_top=False, list_select_related=False, manager=None, list_per_page=100):
self.fields = fields
self.js = js or []
self.list_display = list_display or ['__str__']
+ self.list_display_links = list_display_links or []
self.list_filter = list_filter or []
self.date_hierarchy = date_hierarchy
self.save_as, self.ordering = save_as, ordering
27 docs/model-api.txt
@@ -1225,6 +1225,33 @@ A few special cases to note about ``list_display``:
return self.birthday.strftime('%Y')[:3] + "0's"
decade_born_in.short_description = 'Birth decade'
+Set ``list_display_links`` to control which fields in ``list_display`` should
+be linked to the "change" page for an object.
+By default, the change list page will link the first column -- the first field
+specified in ``list_display`` -- to the change page for each item. But
+``list_display_links`` lets you change which columns are linked. Set
+``list_display_links`` to a list or tuple of field names (in the same format as
+``list_display``) to link.
+``list_display_links`` can specify one or many field names. As long as the
+field names appear in ``list_display``, Django doesn't care how many (or how
+few) fields are linked. The only requirement is: If you want to use
+``list_display_links``, you must define ``list_display``.
+In this example, the ``first_name`` and ``last_name`` fields will be linked on
+the change list page::
+ class Admin:
+ list_display = ('first_name', 'last_name', 'birthday')
+ list_display_links = ('first_name', 'last_name')
+Finally, note that in order to use ``list_display_links``, you must define
+``list_display``, too.

0 comments on commit c184729

Please sign in to comment.
Something went wrong with that request. Please try again.