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:
bash
> 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:
admin.py
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:
admin.py
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)])