Skip to content
Django app enabling painless creation of additional admin object tools.
Python HTML
Branch: develop
Clone or download
cblignaut Merge tag '2.0.0' into develop
1. Django 2.0 & 2.1 compatibility.
2. Added coveralls
3. Deprecated support for versions below Django 1.11.
Latest commit 5923c1e Jan 4, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs/images Update images directory May 24, 2017
object_tools Added coveralls Jan 3, 2019
.coveragerc Added coveralls Jan 3, 2019
.gitignore Updated git ignore Sep 12, 2014
.pep8 Added pep8 exclusions Sep 12, 2014
.travis.yml Modify travis file as well Jan 4, 2019
AUTHORS.rst Updated CHANGELOG May 11, 2017
CHANGELOG.rst Release bump Jan 4, 2019
LICENSE Prep for release Apr 27, 2016 Update manifest May 7, 2012
README.rst Update README Jan 3, 2019 Add manage file and update travis Apr 26, 2016 Release bump Jan 4, 2019
tox.ini No need to set PYTHONPATH explicitly Jan 4, 2019


Django Object Tools

Django app enabling painless creation of additional admin object tools.



  1. Python 2.7, 3.5-3.7
  2. Django 1.11, 2.0, 2.1


  1. Install or add django-object-tools to your python path.

  2. Add object_tools to your INSTALLED_APPS setting. django-object-tools overrides certain admin templates so you have to add it before django.contrib.admin.

  3. Hook up URLConf. Do this by pointing a given URL at the tools.urls method. In this example, we register the default Tools instance at the URL /object-tools/:

    from django.conf.urls.defaults import *
    from  django.conf.urls import url
    import object_tools
    urlpatterns = [
  4. Obviously Django Admin itself needs to be installed, as described here.

  5. Remember to run migrate whenever you install new tools to setup permissions.


django-object-tools itself doesn't do much in terms of providing useful tools. Its purpose is to simplify creation and integration of custom tools delivered by other Django applications. To that end it takes care of the messy details like permissions and admin template integration so you can focus on the fun stuff.

As an example lets create a tool allowing you to delete all objects. Yes this is a bit convoluted but it's a good toy example for illustration purposes. Have a look at django-export and django-order for examples of real world tools leveraging django-object-tools.

Firstly create a Django app folder structure as per usual, with the root directory named delete, including a file called It should look as follows:


Edit to look like this:

from django.contrib.admin.actions import delete_selected
from django.contrib.admin.sites import site
import object_tools

class Delete(object_tools.ObjectTool):
    name = 'delete'
    label = 'Delete all'

    def view(self, request, extra_context=None):
        queryset = self.model.objects.all()
        modeladmin = site._registry.get(self.model)
        response = delete_selected(modeladmin, request, queryset)
        if response:
            return response
            return modeladmin.changelist_view(request)

Let's go through that line by line:

  1. object_tools behaves similarly to Django's admin allowing you to explicitly register tools, see line 17. It also provides the ObjectTool base class.
  1. import delete_selected method provided by Django. This method will do all the heavy lifting.
  1. Create a tool class inheriting from object_tools.ObjectTool. All object tools have to inherit from object_tools.ObjectTool. ObjectTool provides various methods to simplify creation of tools. See for more details.
  2. Set tool name to delete. This has to be a unique name identifying the tool. This is used to uniquely identify the tool internally and for instance to setup permissions.
  3. Set label to Delete all. The label is displayed within admin and not the name, thus allowing you to specify a more verbose, user friendly label.
  1. Implement view method. This is the brains of your tool. The view method is called when the user executes your tool, so your tool logic would go here. This can be any view like code, as long as it returns an HttpResponse object. In this case we wrap Django's built-in delete_selected to provide the form, logic and template code to perform the actual delete.
  1. Register the tool with object_tools, thus enabling its display in admin.

To enable the tool add delete to your INSTALLED_APPS setting.

Now when you navigate to the change list view of any model you'll find the delete all object tool in the upper right hand corner.


Clicking on the Delete all tool fires off the view and proceeds with deleting objects as per usual.

Note: django-object-tools adds per tool permissions to the built-in set of default Django permissions. So in this example only superusers or users who have the the Can delete <model> permission will be able to see and use the tool. If you can't see or use a particular tool make sure the authenticated user has the required permissions to do so.

You can’t perform that action at this time.