diff --git a/django/contrib/admin/validation.py b/django/contrib/admin/validation.py index fa6d7e3e60..92485cac7b 100644 --- a/django/contrib/admin/validation.py +++ b/django/contrib/admin/validation.py @@ -71,21 +71,30 @@ def validate(cls, model): raise ImproperlyConfigured("'%s.list_editable' cannot be used " "without a default ordering. Please define ordering on either %s or %s." % (cls.__name__, cls.__name__, model.__name__)) - for idx, field in enumerate(cls.list_editable): + for idx, field_name in enumerate(cls.list_editable): try: - opts.get_field_by_name(field) + field = opts.get_field_by_name(field_name)[0] except models.FieldDoesNotExist: raise ImproperlyConfigured("'%s.list_editable[%d]' refers to a " - "field, '%s', not defiend on %s." % (cls.__name__, idx, field, model.__name__)) - if field not in cls.list_display: + "field, '%s', not defiend on %s." + % (cls.__name__, idx, field_name, model.__name__)) + if field_name not in cls.list_display: raise ImproperlyConfigured("'%s.list_editable[%d]' refers to " "'%s' which is not defined in 'list_display'." - % (cls.__name__, idx, field)) - if field in cls.list_display_links: + % (cls.__name__, idx, field_name)) + if field_name in cls.list_display_links: raise ImproperlyConfigured("'%s' cannot be in both '%s.list_editable'" " and '%s.list_display_links'" - % (field, cls.__name__, cls.__name__)) - + % (field_name, cls.__name__, cls.__name__)) + if not cls.list_display_links and cls.list_display[0] in cls.list_editable: + raise ImproperlyConfigured("'%s.list_editable[%d]' refers to" + " the first field in list_display, '%s', which can't be" + " used unless list_display_links is set." + % (cls.__name__, idx, cls.list_display[0])) + if not field.editable: + raise ImproperlyConfigured("'%s.list_editable[%d]' refers to a " + "field, '%s', which isn't editable through the admin." + % (cls.__name__, idx, field_name)) # search_fields = () if hasattr(cls, 'search_fields'):