Index: django/contrib/admin/options.py
===================================================================
--- django/contrib/admin/options.py	(revision 9749)
+++ django/contrib/admin/options.py	(working copy)
@@ -39,6 +39,7 @@
     filter_horizontal = ()
     radio_fields = {}
     prepopulated_fields = {}
+    exclude_add = []
     
     def formfield_for_dbfield(self, db_field, **kwargs):
         """
@@ -138,7 +139,8 @@
                 # formfield can be None if it came from a OneToOneField with
                 # parent_link=True
                 if formfield is not None:
-                    formfield.widget = widgets.RelatedFieldWidgetWrapper(formfield.widget, db_field.rel, self.admin_site)
+                    add = db_field.name not in self.exclude_add
+                    formfield.widget = widgets.RelatedFieldWidgetWrapper(formfield.widget, db_field.rel, self.admin_site, add)
             return formfield
         
         # For any other type of field, just call its formfield() method.
Index: django/contrib/admin/widgets.py
===================================================================
--- django/contrib/admin/widgets.py	(revision 9749)
+++ django/contrib/admin/widgets.py	(working copy)
@@ -196,13 +196,14 @@
     This class is a wrapper to a given widget to add the add icon for the
     admin interface.
     """
-    def __init__(self, widget, rel, admin_site):
+    def __init__(self, widget, rel, admin_site, add=True):
         self.is_hidden = widget.is_hidden
         self.needs_multipart_form = widget.needs_multipart_form
         self.attrs = widget.attrs
         self.choices = widget.choices
         self.widget = widget
         self.rel = rel
+        self.add = add
         # so we can check if the related object is registered with this AdminSite
         self.admin_site = admin_site
 
@@ -222,7 +223,8 @@
         related_url = '../../../%s/%s/' % (rel_to._meta.app_label, rel_to._meta.object_name.lower())
         self.widget.choices = self.choices
         output = [self.widget.render(name, value, *args, **kwargs)]
-        if rel_to in self.admin_site._registry: # If the related object has an admin interface:
+        # if the related object has an admin interface and we can show it
+        if self.add and rel_to in self.admin_site._registry:
             # TODO: "id_" is hard-coded here. This should instead use the correct
             # API to determine the ID dynamically.
             output.append(u'<a href="%sadd/" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \
Index: tests/regressiontests/admin_widgets/models.py
===================================================================
--- tests/regressiontests/admin_widgets/models.py	(revision 9749)
+++ tests/regressiontests/admin_widgets/models.py	(working copy)
@@ -48,6 +48,8 @@
 >>> from django.contrib.admin.widgets import FilteredSelectMultiple, AdminSplitDateTime
 >>> from django.contrib.admin.widgets import AdminFileWidget, ForeignKeyRawIdWidget, ManyToManyRawIdWidget
 >>> from django.contrib.admin.widgets import RelatedFieldWidgetWrapper
+>>> from django.contrib.admin import site 
+>>> from django.forms.widgets import Select as SelectWidget 
 
 Calling conditional_escape on the output of widget.render will simulate what
 happens in the template. This is easier than setting up a template and context
@@ -116,6 +118,20 @@
 >>> child_of_hidden = Inventory.objects.create(barcode=94, name='Child of hidden', parent=hidden)
 >>> print w.render('test', child_of_hidden.parent_id, attrs={}) 
 <input type="text" name="test" value="93" class="vForeignKeyRawIdAdminField" /><a href="../../../admin_widgets/inventory/?t=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/admin/selector-search.gif" width="16" height="16" alt="Lookup" /></a>&nbsp;<strong>Hidden</strong>
+
+# Check that RelatedFieldWidgetWrapper doesn'tshow the add image when explicitely requested
+>>> site.register(Band)
+>>> rel = Album._meta.get_field('band').rel
+>>> w = RelatedFieldWidgetWrapper(SelectWidget(), rel, site, True)
+>>> print w.render('test', 'test')
+<select name="test">
+</select><a href="../../../admin_widgets/band/add/" class="add-another" id="add_id_test" onclick="return showAddAnotherPopup(this);"> <img src="/media/img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a>
+
+>>> w = RelatedFieldWidgetWrapper(SelectWidget(), rel, site, False)
+>>> print w.render('test', 'test')
+<select name="test">
+</select>
+
 """ % {
     'ADMIN_MEDIA_PREFIX': settings.ADMIN_MEDIA_PREFIX,
     'STORAGE_URL': default_storage.url(''),
Index: docs/ref/contrib/admin.txt
===================================================================
--- docs/ref/contrib/admin.txt	(revision 9749)
+++ docs/ref/contrib/admin.txt	(working copy)
@@ -224,6 +224,19 @@
 ``birth_date``, the forms resulting from the above declarations will contain
 exactly the same fields.
 
+``exclude_add``
+~~~~~~~~~~~~~~~
+
+Disable the related field "add another" popup for any field listed.
+
+For example::
+    
+    class BookAdmin(admin.ModelAdmin):
+        exclude_add = ['author']
+
+In the admin form for the Book model, the author field will appear without the popup link
+next to it.
+
 ``filter_horizontal``
 ~~~~~~~~~~~~~~~~~~~~~ 

