Loading django/contrib/admin/templates/admin/change_list.html +2 −2 Original line number Diff line number Diff line Loading @@ -40,18 +40,18 @@ {% block content %} <div id="content-main"> {% block object-tools %} {% if has_add_permission %} <ul class="object-tools"> {% block object-tools-items %} {% if has_add_permission %} <li> {% url cl.opts|admin_urlname:'add' as add_url %} <a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink"> {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} </a> </li> {% endif %} {% endblock %} </ul> {% endif %} {% endblock %} {% if cl.formset.errors %} <p class="errornote"> Loading docs/releases/1.10.txt +4 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,10 @@ Minor features classes on inline fieldsets. Inlines with a ``collapse`` class will be initially collapsed and their header will have a small "show" link. * If a user doesn't have the add permission, the ``object-tools`` block on a model's changelist will now be rendered (without the add button, of course). This makes it easier to add custom tools in this case. :mod:`django.contrib.admindocs` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Loading tests/admin_changelist/admin.py +3 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ class EventAdmin(admin.ModelAdmin): def event_date_func(self, event): return event.date def has_add_permission(self, request): return False site.register(Event, EventAdmin) Loading tests/admin_changelist/tests.py +18 −3 Original line number Diff line number Diff line Loading @@ -21,9 +21,10 @@ from .admin import ( BandAdmin, ChildAdmin, ChordsBandAdmin, ConcertAdmin, CustomPaginationAdmin, CustomPaginator, DynamicListDisplayChildAdmin, DynamicListDisplayLinksChildAdmin, DynamicListFilterChildAdmin, DynamicSearchFieldsChildAdmin, EmptyValueChildAdmin, FilteredChildAdmin, GroupAdmin, InvitationAdmin, NoListDisplayLinksParentAdmin, ParentAdmin, QuartetAdmin, SwallowAdmin, site as custom_site, DynamicSearchFieldsChildAdmin, EmptyValueChildAdmin, EventAdmin, FilteredChildAdmin, GroupAdmin, InvitationAdmin, NoListDisplayLinksParentAdmin, ParentAdmin, QuartetAdmin, SwallowAdmin, site as custom_site, ) from .models import ( Band, Child, ChordsBand, ChordsMusician, Concert, CustomIdUser, Event, Loading Loading @@ -761,6 +762,20 @@ class ChangeListTests(TestCase): list(real_page_range), ) def test_object_tools_displayed_no_add_permission(self): """ When ModelAdmin.has_add_permission() returns False, the object-tools block is still shown. """ superuser = self._create_superuser('superuser') m = EventAdmin(Event, custom_site) request = self._mocked_authenticated_request('/event/', superuser) self.assertFalse(m.has_add_permission(request)) response = m.changelist_view(request) self.assertIn('<ul class="object-tools">', response.rendered_content) # The "Add" button inside the object-tools shouldn't appear. self.assertNotIn('Add', response.rendered_content) class AdminLogNodeTestCase(TestCase): Loading Loading
django/contrib/admin/templates/admin/change_list.html +2 −2 Original line number Diff line number Diff line Loading @@ -40,18 +40,18 @@ {% block content %} <div id="content-main"> {% block object-tools %} {% if has_add_permission %} <ul class="object-tools"> {% block object-tools-items %} {% if has_add_permission %} <li> {% url cl.opts|admin_urlname:'add' as add_url %} <a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink"> {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} </a> </li> {% endif %} {% endblock %} </ul> {% endif %} {% endblock %} {% if cl.formset.errors %} <p class="errornote"> Loading
docs/releases/1.10.txt +4 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,10 @@ Minor features classes on inline fieldsets. Inlines with a ``collapse`` class will be initially collapsed and their header will have a small "show" link. * If a user doesn't have the add permission, the ``object-tools`` block on a model's changelist will now be rendered (without the add button, of course). This makes it easier to add custom tools in this case. :mod:`django.contrib.admindocs` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Loading
tests/admin_changelist/admin.py +3 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ class EventAdmin(admin.ModelAdmin): def event_date_func(self, event): return event.date def has_add_permission(self, request): return False site.register(Event, EventAdmin) Loading
tests/admin_changelist/tests.py +18 −3 Original line number Diff line number Diff line Loading @@ -21,9 +21,10 @@ from .admin import ( BandAdmin, ChildAdmin, ChordsBandAdmin, ConcertAdmin, CustomPaginationAdmin, CustomPaginator, DynamicListDisplayChildAdmin, DynamicListDisplayLinksChildAdmin, DynamicListFilterChildAdmin, DynamicSearchFieldsChildAdmin, EmptyValueChildAdmin, FilteredChildAdmin, GroupAdmin, InvitationAdmin, NoListDisplayLinksParentAdmin, ParentAdmin, QuartetAdmin, SwallowAdmin, site as custom_site, DynamicSearchFieldsChildAdmin, EmptyValueChildAdmin, EventAdmin, FilteredChildAdmin, GroupAdmin, InvitationAdmin, NoListDisplayLinksParentAdmin, ParentAdmin, QuartetAdmin, SwallowAdmin, site as custom_site, ) from .models import ( Band, Child, ChordsBand, ChordsMusician, Concert, CustomIdUser, Event, Loading Loading @@ -761,6 +762,20 @@ class ChangeListTests(TestCase): list(real_page_range), ) def test_object_tools_displayed_no_add_permission(self): """ When ModelAdmin.has_add_permission() returns False, the object-tools block is still shown. """ superuser = self._create_superuser('superuser') m = EventAdmin(Event, custom_site) request = self._mocked_authenticated_request('/event/', superuser) self.assertFalse(m.has_add_permission(request)) response = m.changelist_view(request) self.assertIn('<ul class="object-tools">', response.rendered_content) # The "Add" button inside the object-tools shouldn't appear. self.assertNotIn('Add', response.rendered_content) class AdminLogNodeTestCase(TestCase): Loading