Commit fdf96029 authored by Luke Plant's avatar Luke Plant
Browse files

Fixed #11058 - list_display_links doesn't allow callables not defined in the model

Thanks to dvine for the report and julien for the patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15619 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 1b062f66
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -46,7 +46,6 @@ def validate(cls, model):
    if hasattr(cls, 'list_display_links'):
        check_isseq(cls, 'list_display_links', cls.list_display_links)
        for idx, field in enumerate(cls.list_display_links):
            fetch_attr(cls, model, opts, 'list_display_links[%d]' % idx, field)
            if field not in cls.list_display:
                raise ImproperlyConfigured("'%s.list_display_links[%d]' "
                        "refers to '%s' which is not defined in 'list_display'."
+3 −3
Original line number Diff line number Diff line
@@ -479,11 +479,11 @@ subclass::
    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
    ``list_display_links`` to a list or tuple of fields (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
    ``list_display_links`` can specify one or many fields. As long as the
    fields 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``.

+4 −1
Original line number Diff line number Diff line
@@ -32,5 +32,8 @@ class ValidationTestModel(models.Model):
    pub_date = models.DateTimeField()
    band = models.ForeignKey(Band)

    def decade_published_in(self):
        return self.pub_date.strftime('%Y')[:3] + "0's"

class ValidationTestInlineModel(models.Model):
    parent = models.ForeignKey(ValidationTestModel)
+15 −5
Original line number Diff line number Diff line
@@ -771,8 +771,13 @@ class ValidationTests(unittest.TestCase):
            ValidationTestModel,
        )

        def a_callable(obj):
            pass

        class ValidationTestModelAdmin(ModelAdmin):
            list_display = ('name',)
            def a_method(self, obj):
                pass
            list_display = ('name', 'decade_published_in', 'a_method', a_callable)

        validate(ValidationTestModelAdmin, ValidationTestModel)

@@ -794,7 +799,7 @@ class ValidationTests(unittest.TestCase):

        self.assertRaisesRegexp(
            ImproperlyConfigured,
            "'ValidationTestModelAdmin.list_display_links\[0\]' refers to 'non_existent_field' that is neither a field, method or property of model 'ValidationTestModel'.",
            "'ValidationTestModelAdmin.list_display_links\[0\]' refers to 'non_existent_field' which is not defined in 'list_display'.",
            validate,
            ValidationTestModelAdmin,
            ValidationTestModel,
@@ -811,9 +816,14 @@ class ValidationTests(unittest.TestCase):
            ValidationTestModel,
        )

        def a_callable(obj):
            pass

        class ValidationTestModelAdmin(ModelAdmin):
            list_display = ('name',)
            list_display_links = ('name',)
            def a_method(self, obj):
                pass
            list_display = ('name', 'decade_published_in', 'a_method', a_callable)
            list_display_links = ('name', 'decade_published_in', 'a_method', a_callable)

        validate(ValidationTestModelAdmin, ValidationTestModel)