Skip to content

Commit

Permalink
[1.1.X] Fixed #12689: Fixed admin validation to report an error on in…
Browse files Browse the repository at this point in the history
…valid exclude specification. Thanks for report to bparker and for patch with tests to ramiro.

r12734 from trunk.


git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12735 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
kmtracey committed Mar 9, 2010
1 parent 0cac2cb commit f13b17a
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
14 changes: 14 additions & 0 deletions django/contrib/admin/validation.py
Expand Up @@ -220,6 +220,20 @@ def validate_base(cls, model):
for field in flattened_fieldsets: for field in flattened_fieldsets:
check_formfield(cls, model, opts, "fieldsets[%d][1]['fields']" % idx, field) check_formfield(cls, model, opts, "fieldsets[%d][1]['fields']" % idx, field)


# exclude
if cls.exclude: # default value is None
check_isseq(cls, 'exclude', cls.exclude)
for field in cls.exclude:
check_formfield(cls, model, opts, 'exclude', field)
try:
f = opts.get_field(field)
except models.FieldDoesNotExist:
# If we can't find a field on the model that matches,
# it could be an extra field on the form.
continue
if len(cls.exclude) > len(set(cls.exclude)):
raise ImproperlyConfigured('There are duplicate field(s) in %s.exclude' % cls.__name__)

# form # form
if hasattr(cls, 'form') and not issubclass(cls.form, BaseModelForm): if hasattr(cls, 'form') and not issubclass(cls.form, BaseModelForm):
raise ImproperlyConfigured("%s.form does not inherit from " raise ImproperlyConfigured("%s.form does not inherit from "
Expand Down
34 changes: 33 additions & 1 deletion tests/regressiontests/admin_validation/models.py
Expand Up @@ -25,7 +25,8 @@ class TwoAlbumFKAndAnE(models.Model):
album2 = models.ForeignKey(Album, related_name="album2_set") album2 = models.ForeignKey(Album, related_name="album2_set")
e = models.CharField(max_length=1) e = models.CharField(max_length=1)



class Book(models.Model):
name = models.CharField(max_length=100)


__test__ = {'API_TESTS':""" __test__ = {'API_TESTS':"""
Expand All @@ -52,6 +53,37 @@ class TwoAlbumFKAndAnE(models.Model):
... ...
ImproperlyConfigured: 'InvalidFields.fields' refers to field 'spam' that is missing from the form. ImproperlyConfigured: 'InvalidFields.fields' refers to field 'spam' that is missing from the form.
# Tests for basic validation of 'exclude' option values (#12689)
>>> class ExcludedFields1(admin.ModelAdmin):
... exclude = ('foo')
>>> validate(ExcludedFields1, Book)
Traceback (most recent call last):
...
ImproperlyConfigured: 'ExcludedFields1.exclude' must be a list or tuple.
>>> class ExcludedFields2(admin.ModelAdmin):
... exclude = ('name', 'name')
>>> validate(ExcludedFields2, Book)
Traceback (most recent call last):
...
ImproperlyConfigured: There are duplicate field(s) in ExcludedFields2.exclude
>>> class ExcludedFieldsInline(admin.TabularInline):
... model = Song
... exclude = ('foo')
>>> class ExcludedFieldsAlbumAdmin(admin.ModelAdmin):
... model = Album
... inlines = [ExcludedFieldsInline]
>>> validate(ExcludedFieldsAlbumAdmin, Album)
Traceback (most recent call last):
...
ImproperlyConfigured: 'ExcludedFieldsInline.exclude' must be a list or tuple.
# Regression test for #9932 - exclude in InlineModelAdmin # Regression test for #9932 - exclude in InlineModelAdmin
# should not contain the ForeignKey field used in ModelAdmin.model # should not contain the ForeignKey field used in ModelAdmin.model
Expand Down

0 comments on commit f13b17a

Please sign in to comment.