Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Add a custom admin page for a model and link to it from the detail page
from functools import update_wrapper
from django.contrib import admin
from django.contrib.admin import ModelAdmin
from django.contrib.admin.templatetags.admin_urls import add_preserved_filters
from django.core.exceptions import PermissionDenied
from django.shortcuts import render
from myapp.models import Widget
from myapp.forms import ManageWidgetForm
class WidgetAdmin(ModelAdmin):
change_form_template = 'myapp/change_form.html'
manage_view_template = 'myapp/manage_view.html'
def get_urls(self):
from django.conf.urls import patterns, url
def wrap(view):
def wrapper(*args, **kwargs):
return self.admin_site.admin_view(view)(*args, **kwargs)
return update_wrapper(wrapper, view)
info = self.model._meta.app_label, self.model._meta.model_name
urls = patterns('',
name='%s_%s_manage' % info),
super_urls = super(WidgetAdmin, self).get_urls()
return urls + super_urls
def manage_view(self, request, id, form_url='', extra_context=None):
opts = Widget._meta
form = ManageWidgetForm()
obj = Widget.objects.get(pk=id)
if not self.has_change_permission(request, obj):
raise PermissionDenied
# do cool management stuff here
preserved_filters = self.get_preserved_filters(request)
form_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, form_url)
context = {
'title': 'Manage %s' % obj,
'has_change_permission': self.has_change_permission(request, obj),
'form_url': form_url,
'opts': opts,
'errors': form.errors,
'app_label': opts.app_label,
'original': obj,
context.update(extra_context or {})
return render(request, self.manage_view_template, context), WidgetAdmin)
{% extends "admin/change_form.html" %}
{% load i18n admin_urls admin_static admin_modify %}
{% block object-tools-items %}
{% url opts|admin_urlname:'manage'|admin_urlquote as manage_url %}
<a href="{% add_preserved_filters manage_url %}" class="historylink">{% trans "Manage" %}</a>
{% block.super %}
{% endblock %}
{% extends "admin/base_site.html" %}
{% load i18n admin_urls admin_static admin_modify %}
{% load humanize tz %}
{% block breadcrumbs %}
<div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ app_label|capfirst|escape }}</a>
&rsaquo; {% if has_change_permission %}<a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %}
&rsaquo; {% trans 'Manage' %} {{ original|truncatewords:"18" }}
{% endblock %}
{% block content %}
{% timezone "America/Los_Angeles" %}
<form action="{{ form_url }}" method="post">
{% csrf_token %}
<!-- do cool form things -->
{% endtimezone %}
{% endblock %}

This comment has been minimized.

Copy link
Owner Author

@mattlong mattlong commented Sep 19, 2014

Based on Django 1.6


This comment has been minimized.

Copy link

@puliyadivinod puliyadivinod commented Oct 29, 2014

cool thanks!


This comment has been minimized.

Copy link

@gergelypolonkai gergelypolonkai commented Jul 31, 2015

Works fine on 1.8 except I had to change

{% block.super %}


{{ block.super }}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment