Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #7973 -- Added exclude to BaseModelAdmin to make everything con…

…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...
commit c1de41f4d29d15616075ffd474e3aba7adcfc64f 1 parent 326b266
@brosner brosner authored
View
11 django/contrib/admin/options.py
@@ -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 = ()
@@ -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)
@@ -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,
View
26 docs/ref/contrib/admin.txt
@@ -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``
~~~~~~~~~~~~~~~~~~~~~
View
1  tests/modeltests/model_formsets/models.py
@@ -701,5 +701,4 @@ class Membership(models.Model):
>>> formset.is_valid()
True
-
"""}
View
17 tests/regressiontests/modeladmin/models.py
@@ -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.
Please sign in to comment.
Something went wrong with that request. Please try again.