Skip to content

Commit

Permalink
Fixed #7973 -- Added exclude to BaseModelAdmin to make everything con…
Browse files Browse the repository at this point in the history
…sistent with the form/formset factories. Refs #8071 to make it easier to get at exclude. Thanks julien for the patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@8861 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
brosner committed Sep 2, 2008
1 parent 326b266 commit c1de41f
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 1 deletion.
11 changes: 11 additions & 0 deletions django/contrib/admin/options.py
Expand Up @@ -31,6 +31,7 @@ class BaseModelAdmin(object):
"""Functionality common to both ModelAdmin and InlineAdmin."""
raw_id_fields = ()
fields = None
exclude = None
fieldsets = None
form = forms.ModelForm
filter_vertical = ()
Expand Down Expand Up @@ -262,9 +263,14 @@ def get_form(self, request, obj=None, **kwargs):
fields = flatten_fieldsets(self.declared_fieldsets)
else:
fields = None
if self.exclude is None:
exclude = []
else:
exclude = self.exclude
defaults = {
"form": self.form,
"fields": fields,
"exclude": exclude + kwargs.get("exclude", []),
"formfield_callback": self.formfield_for_dbfield,
}
defaults.update(kwargs)
Expand Down Expand Up @@ -780,11 +786,16 @@ def get_formset(self, request, obj=None, **kwargs):
fields = flatten_fieldsets(self.declared_fieldsets)
else:
fields = None
if self.exclude is None:
exclude = []
else:
exclude = self.exclude
defaults = {
"form": self.form,
"formset": self.formset,
"fk_name": self.fk_name,
"fields": fields,
"exclude": exclude + kwargs.get("exclude", []),
"formfield_callback": self.formfield_for_dbfield,
"extra": self.extra,
"max_num": self.max_num,
Expand Down
26 changes: 26 additions & 0 deletions docs/ref/contrib/admin.txt
Expand Up @@ -181,6 +181,32 @@ displayed, sequentially, in the form.
dictionary key that is within the ``fieldsets`` option, as described in
the previous section.

``exclude``
~~~~~~~~~~~

This attribute, if given, should be a list of field names to exclude from the
form.

For example, let's consider the following model::

class Author(models.Model):
name = models.CharField(max_length=100)
title = models.CharField(max_length=3)
birth_date = models.DateField(blank=True, null=True)

If you want a form for the ``Author`` model that includes only the ``name``
and ``title`` fields, you would specify ``fields`` or ``exclude`` like this::

class AuthorAdmin(admin.ModelAdmin):
fields = ('name', 'title')

class AuthorAdmin(admin.ModelAdmin):
exclude = ('birth_date',)

Since the Author model only has three fields, ``name``, ``title``, and
``birth_date``, the forms resulting from the above declarations will contain
exactly the same fields.

``filter_horizontal``
~~~~~~~~~~~~~~~~~~~~~

Expand Down
1 change: 0 additions & 1 deletion tests/modeltests/model_formsets/models.py
Expand Up @@ -701,5 +701,4 @@ class Membership(models.Model):
>>> formset.is_valid()
True
"""}
17 changes: 17 additions & 0 deletions tests/regressiontests/modeladmin/models.py
Expand Up @@ -116,6 +116,23 @@ class and an AdminSite instance, so let's just go ahead and do that manually
['name']
# Using `exclude`.
>>> class BandAdmin(ModelAdmin):
... exclude = ['bio']
>>> ma = BandAdmin(Band, site)
>>> ma.get_form(request).base_fields.keys()
['name', 'sign_date']
# Using `fields` and `exclude`.
>>> class BandAdmin(ModelAdmin):
... fields = ['name', 'bio']
... exclude = ['bio']
>>> ma = BandAdmin(Band, site)
>>> ma.get_form(request).base_fields.keys()
['name']
If we specify a form, it should use it allowing custom validation to work
properly. This won't, however, break any of the admin widgets or media.
Expand Down

0 comments on commit c1de41f

Please sign in to comment.