Automatically generating admin URLs for your objects

Most Django developers are familiar with how easy it is to generate URLs for you objects using get_absolute_url() - you simply create a model method that reverses the object’s ‘detail’ url. The Django docs also outline how to easily reverse admin URLs for model instances allowing you to quickly generate links to the backend of your app.

A nice extension of these principles is to create a get_admin_url() model method that automatically generates the reversed admins URL:

$ book = Book.objects.get(pk=1)
$ print(book.get_admin_url())
"/admin/library/book/1/"

The method itself can be implemented as a model mixin meaning you can easily reuse this in numerous models:

from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse

class AdminURLMixin(object):
    def get_admin_url(self):
        content_type = ContentType.objects.get_for_model(self.__class__)
        return reverse("admin:%s_%s_change" % (
            content_type.app_label,
            content_type.model),
            args=(self.id,))

 class Book(models.Model, AdminURLMixin):
     ...

or if you perfer using the permalink decorator:

from django.contrib.contenttypes.models import ContentType
from django.db import models

class AdminURLMixin(object):
    @models.permalink
    def get_admin_url(self):
        content_type = ContentType \
            .objects \
            .get_for_model(self.__class__)
        return ('admin:%s_%s_change' % (
            content_type.app_label,
            content_type.model), [str(self.id)])