Django

Code

Ticket #9071: add-r9751.diff

File add-r9751.diff, 5.3 kB (added by jackymac, 1 year ago)

updated patch to so it applies cleanly to SVN-9751, added docs

  • django/contrib/admin/options.py

    old new  
    3939    filter_horizontal = () 
    4040    radio_fields = {} 
    4141    prepopulated_fields = {} 
     42    exclude_add = [] 
    4243     
    4344    def formfield_for_dbfield(self, db_field, **kwargs): 
    4445        """ 
     
    138139                # formfield can be None if it came from a OneToOneField with 
    139140                # parent_link=True 
    140141                if formfield is not None: 
    141                     formfield.widget = widgets.RelatedFieldWidgetWrapper(formfield.widget, db_field.rel, self.admin_site) 
     142                    add = db_field.name not in self.exclude_add 
     143                    formfield.widget = widgets.RelatedFieldWidgetWrapper(formfield.widget, db_field.rel, self.admin_site, add) 
    142144            return formfield 
    143145         
    144146        # For any other type of field, just call its formfield() method. 
  • django/contrib/admin/widgets.py

    old new  
    196196    This class is a wrapper to a given widget to add the add icon for the 
    197197    admin interface. 
    198198    """ 
    199     def __init__(self, widget, rel, admin_site): 
     199    def __init__(self, widget, rel, admin_site, add=True): 
    200200        self.is_hidden = widget.is_hidden 
    201201        self.needs_multipart_form = widget.needs_multipart_form 
    202202        self.attrs = widget.attrs 
    203203        self.choices = widget.choices 
    204204        self.widget = widget 
    205205        self.rel = rel 
     206        self.add = add 
    206207        # so we can check if the related object is registered with this AdminSite 
    207208        self.admin_site = admin_site 
    208209 
     
    222223        related_url = '../../../%s/%s/' % (rel_to._meta.app_label, rel_to._meta.object_name.lower()) 
    223224        self.widget.choices = self.choices 
    224225        output = [self.widget.render(name, value, *args, **kwargs)] 
    225         if rel_to in self.admin_site._registry: # If the related object has an admin interface: 
     226        # if the related object has an admin interface and we can show it 
     227        if self.add and rel_to in self.admin_site._registry: 
    226228            # TODO: "id_" is hard-coded here. This should instead use the correct 
    227229            # API to determine the ID dynamically. 
    228230            output.append(u'<a href="%sadd/" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \ 
  • tests/regressiontests/admin_widgets/models.py

    old new  
    4848>>> from django.contrib.admin.widgets import FilteredSelectMultiple, AdminSplitDateTime 
    4949>>> from django.contrib.admin.widgets import AdminFileWidget, ForeignKeyRawIdWidget, ManyToManyRawIdWidget 
    5050>>> from django.contrib.admin.widgets import RelatedFieldWidgetWrapper 
     51>>> from django.contrib.admin import site  
     52>>> from django.forms.widgets import Select as SelectWidget  
    5153 
    5254Calling conditional_escape on the output of widget.render will simulate what 
    5355happens in the template. This is easier than setting up a template and context 
     
    116118>>> child_of_hidden = Inventory.objects.create(barcode=94, name='Child of hidden', parent=hidden) 
    117119>>> print w.render('test', child_of_hidden.parent_id, attrs={})  
    118120<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> 
     121 
     122# Check that RelatedFieldWidgetWrapper doesn'tshow the add image when explicitely requested 
     123>>> site.register(Band) 
     124>>> rel = Album._meta.get_field('band').rel 
     125>>> w = RelatedFieldWidgetWrapper(SelectWidget(), rel, site, True) 
     126>>> print w.render('test', 'test') 
     127<select name="test"> 
     128</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> 
     129 
     130>>> w = RelatedFieldWidgetWrapper(SelectWidget(), rel, site, False) 
     131>>> print w.render('test', 'test') 
     132<select name="test"> 
     133</select> 
     134 
    119135""" % { 
    120136    'ADMIN_MEDIA_PREFIX': settings.ADMIN_MEDIA_PREFIX, 
    121137    'STORAGE_URL': default_storage.url(''), 
  • docs/ref/contrib/admin.txt

    old new  
    224224``birth_date``, the forms resulting from the above declarations will contain 
    225225exactly the same fields. 
    226226 
     227``exclude_add`` 
     228~~~~~~~~~~~~~~~ 
     229 
     230Disable the related field "add another" popup for any field listed. 
     231 
     232For example:: 
     233     
     234    class BookAdmin(admin.ModelAdmin): 
     235        exclude_add = ['author'] 
     236 
     237In the admin form for the Book model, the author field will appear without the popup link 
     238next to it. 
     239 
    227240``filter_horizontal`` 
    228241~~~~~~~~~~~~~~~~~~~~~  
    229242