Remove "add another" in Django admin screen

N.B. Works for DJango 1.5.2 and possibly older. The can_add_related property appeared around 2 years ago.

The best way I've found is to override your ModelAdmin's get_form function. In my case I wanted to force the author of a post to be the currently logged in user. Code below with copious comments. The really important bit is the setting of widget.can_add_related:

def get_form(self,request, obj=None, **kwargs):
    # get base form object    
    form = super(BlogPostAdmin,self).get_form(request, obj, **kwargs)

    # get the foreign key field I want to restrict
    author = form.base_fields["author"]

    # remove the green + by setting can_add_related to False on the widget
    author.widget.can_add_related = False

    # restrict queryset for field to just the current user
    author.queryset = User.objects.filter(pk=request.user.pk)

    # set the initial value of the field to current user. Redundant as there will
    # only be one option anyway.
    author.initial = request.user.pk

    # set the field's empty_label to None to remove the "------" null 
    # field from the select. 
    author.empty_label = None

    # return our now modified form.
    return form

The interesting part of making the changes here in get_form is that author.widget is an instance of django.contrib.admin.widgets.RelatedFieldWidgetWrapper where as if you try and make changes in one of the formfield_for_xxxxx functions, the widget is an instance of the actual form widget, in this typical ForeignKey case it's a django.forms.widgets.Select.


Though most of the solutions mentioned here work, there is another cleaner way of doing it. Probably it was introduced in a later version of Django, after the other solutions were presented. (I'm presently using Django 1.7)

To remove the "Add another" option,

class ... #(Your inline class)

    def has_add_permission(self, request):
        return False

Similarly if you want to disable "Delete?" option, add the following method in Inline class.

    def has_delete_permission(self, request, obj=None):
        return False

The following answer was my original answer but it is wrong and does not answer OP's question:

Simpler solution, no CSS hack and no editing Django codebase:

Add this to your Inline class:

max_num=0

(this is only applicable to inline forms, not foreign key fields as OP asked)


The above answer is only useful to hide the "add related" button for inline forms, and not foreign keys as requested.

When I wrote the answer, IIRC the accepted answer hid both, which is why I got confused.

The following seems to provide a solution (though hiding using CSS seems the most feasible thing to do, especially if the "add another" buttons of FKs are in inline forms):

Django 1.7 removing Add button from inline form