Index: docs/ref/contrib/admin/index.txt
===================================================================
--- docs/ref/contrib/admin/index.txt	(revision 15922)
+++ docs/ref/contrib/admin/index.txt	(working copy)
@@ -261,6 +261,18 @@
             ``django.utils.html.escape()`` to escape any HTML special
             characters.
 
+.. attribute:: ModelAdmin.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.
+
 .. attribute:: ModelAdmin.filter_horizontal
 
     By default, a :class:`~django.db.models.ManyToManyField` is displayed in
Index: tests/regressiontests/admin_views/tests.py
===================================================================
--- tests/regressiontests/admin_views/tests.py	(revision 15922)
+++ tests/regressiontests/admin_views/tests.py	(working copy)
@@ -116,6 +116,13 @@
         response = self.client.post('/test_admin/%s/admin_views/section/add/' % self.urlbit, post_data)
         self.assertEqual(response.status_code, 302) # redirect somewhere
 
+    def testExcludeAdd(self):
+        """
+        Test if we can disable "add" popup links in the admin
+        """
+        response = self.client.get(reverse('admin:admin_views_answer_add'))
+        self.assertNotContains(response, """<a href="/test_admin/admin/admin_views/question/add/" class="add-another" id="add_id_question" onclick="return showAddAnotherPopup(this);"> <img src="/static/admin/img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a>""")
+
     def testPopupAddPost(self):
         """
         Ensure http response from a popup is properly escaped.
Index: tests/regressiontests/admin_views/models.py
===================================================================
--- tests/regressiontests/admin_views/models.py	(revision 15922)
+++ tests/regressiontests/admin_views/models.py	(working copy)
@@ -676,6 +676,9 @@
     def __unicode__(self):
         return self.answer
 
+class AnswerAdmin(admin.ModelAdmin):
+    exclude_add = ['question']
+
 class Reservation(models.Model):
     start_date = models.DateTimeField()
     price = models.IntegerField()
@@ -817,4 +820,4 @@
 admin.site.register(Topping)
 admin.site.register(Album, AlbumAdmin)
 admin.site.register(Question)
-admin.site.register(Answer)
+admin.site.register(Answer, AnswerAdmin)
Index: django/contrib/admin/options.py
===================================================================
--- django/contrib/admin/options.py	(revision 15922)
+++ django/contrib/admin/options.py	(working copy)
@@ -70,6 +70,7 @@
     formfield_overrides = {}
     readonly_fields = ()
     ordering = None
+    exclude_add = []
 
     def __init__(self):
         overrides = FORMFIELD_FOR_DBFIELD_DEFAULTS.copy()
@@ -113,7 +114,8 @@
                 related_modeladmin = self.admin_site._registry.get(
                                                             db_field.rel.to)
                 can_add_related = bool(related_modeladmin and
-                            related_modeladmin.has_add_permission(request))
+                            related_modeladmin.has_add_permission(request) and
+                            db_field.name not in self.exclude_add)
                 formfield.widget = widgets.RelatedFieldWidgetWrapper(
                             formfield.widget, db_field.rel, self.admin_site,
                             can_add_related=can_add_related)
