Remove “add another” in Django admin screen

后端 未结 10 605
孤独总比滥情好
孤独总比滥情好 2020-12-05 13:34

Whenever I\'m editing object A with a foreign key to object B, a plus option \"add another\" is available next to the choices of object B. How do I remove that option?

10条回答
  •  时光说笑
    2020-12-05 13:52

    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.

提交回复
热议问题