Index: django/contrib/admin/options.py
===================================================================
--- django/contrib/admin/options.py	(revision 11629)
+++ django/contrib/admin/options.py	(working copy)
@@ -1109,6 +1109,7 @@
     fk_name = None
     formset = BaseInlineFormSet
     extra = 3
+    can_delete = True
     max_num = 0
     template = None
     verbose_name = None
@@ -1154,6 +1155,7 @@
             "exclude": (exclude + kwargs.get("exclude", [])) or None,
             "formfield_callback": curry(self.formfield_for_dbfield, request=request),
             "extra": self.extra,
+            "can_delete": self.can_delete,
             "max_num": self.max_num,
         }
         defaults.update(kwargs)
Index: django/contrib/contenttypes/generic.py
===================================================================
--- django/contrib/contenttypes/generic.py	(revision 11629)
+++ django/contrib/contenttypes/generic.py	(working copy)
@@ -386,7 +386,7 @@
             "formfield_callback": self.formfield_for_dbfield,
             "formset": self.formset,
             "extra": self.extra,
-            "can_delete": True,
+            "can_delete": self.can_delete,
             "can_order": False,
             "fields": fields,
             "max_num": self.max_num,
Index: tests/regressiontests/generic_inline_admin/tests.py
===================================================================
--- tests/regressiontests/generic_inline_admin/tests.py	(revision 11629)
+++ tests/regressiontests/generic_inline_admin/tests.py	(working copy)
@@ -5,7 +5,7 @@
 from django.contrib.contenttypes.generic import generic_inlineformset_factory
 
 # local test models
-from models import Episode, EpisodeExtra, EpisodeMaxNum, EpisodeExclude, Media
+from models import Episode, EpisodeExtra, EpisodeCanDelete, EpisodeMaxNum, EpisodeExclude, Media
 
 class GenericAdminViewTest(TestCase):
     fixtures = ['users.xml']
@@ -121,6 +121,15 @@
         self.assertEqual(formset.total_form_count(), 1)
         self.assertEqual(formset.initial_form_count(), 1)
 
+    def testCanDeleteParam(self):
+        """
+        With can_delete=False, there should be no ability to delete.
+        """
+        e = self._create_object(EpisodeCanDelete)
+        response = self.client.get('/generic_inline_admin/admin/generic_inline_admin/episodecandelete/%s/' % e.pk)
+        formset = response.context['inline_admin_formsets'][0].formset
+        self.assertEqual(formset.can_delete, False)
+
     def testMaxNumParam(self):
         """
         With extra=5 and max_num=2, there should be only 2 forms.
@@ -139,4 +148,5 @@
         e = self._create_object(EpisodeExclude)
         response = self.client.get('/generic_inline_admin/admin/generic_inline_admin/episodeexclude/%s/' % e.pk)
         formset = response.context['inline_admin_formsets'][0].formset
-        self.failIf('url' in formset.forms[0], 'The formset has excluded "url" field.')
+        self.failIf('url' in formset.forms[0], 'The formset has excluded "url" field.')
+
Index: tests/regressiontests/generic_inline_admin/models.py
===================================================================
--- tests/regressiontests/generic_inline_admin/models.py	(revision 11629)
+++ tests/regressiontests/generic_inline_admin/models.py	(working copy)
@@ -46,6 +46,19 @@
 admin.site.register(EpisodeExtra, inlines=[MediaExtraInline])
 
 #
+# Generic inline with can_delete = True
+#
+
+class EpisodeCanDelete(Episode):
+    pass
+
+class MediaCanDeleteInline(generic.GenericTabularInline):
+    model = Media
+    can_delete = False
+
+admin.site.register(EpisodeCanDelete, inlines=[MediaCanDeleteInline])
+
+#
 # Generic inline with extra and max_num
 #
 
Index: tests/regressiontests/modeladmin/models.py
===================================================================
--- tests/regressiontests/modeladmin/models.py	(revision 11629)
+++ tests/regressiontests/modeladmin/models.py	(working copy)
@@ -908,6 +908,15 @@
 ...     inlines = [ValidationTestInline]
 >>> validate(ValidationTestModelAdmin, ValidationTestModel)
 
+# can_delete
+
+>>> class ValidationTestInline(TabularInline):
+...     model = ValidationTestInlineModel
+...     can_delete = False
+>>> class ValidationTestModelAdmin(ModelAdmin):
+...     inlines = [ValidationTestInline]
+>>> validate(ValidationTestModelAdmin, ValidationTestModel)
+
 # max_num
 
 >>> class ValidationTestInline(TabularInline):
Index: docs/ref/contrib/admin/index.txt
===================================================================
--- docs/ref/contrib/admin/index.txt	(revision 11629)
+++ docs/ref/contrib/admin/index.txt	(working copy)
@@ -987,6 +987,13 @@
 to the initial forms. See the
 :ref:`formsets documentation <topics-forms-formsets>` for more information.
 
+``can_delete``
+~~~~~~~~~~~~~~
+
+The value for ``can_delete`` defaults to ``True``.  This controls the ability 
+to delete relations in the formset. See the
+:ref:`formsets documentation <topics-forms-formsets>` for more information.
+
 ``max_num``
 ~~~~~~~~~~~
 
