Когда моделей становится много появляется необходимость знать о моделях несколько больше информации, чем представлено на стандартном списке интерфейса администратора.
Можно добавить к каждой модели текстовую строку, которая будет буквально рассказывать о назначении соответствующей модели.
Логично реализовать вывод текста с помощью собственного шаблонного тега. Для этого создаём в приложении каталог templatetags, в котором размещаем модуль шаблонного тега:
from django import template
from django.db.models import get_model
register = template.Library()
@register.simple_tag
def model_desc(url, app_name=None):
values = url.split('/')
if len(values) > 2: # project mode
model_name = values[1]
else: # application mode
model_name = values[0]
return getattr(get_model(app_name, model_name), 'model_desc', '')
Проверка на количество значений в списке после split() помогает определиться с текущим режимом отображения списка приложения: это главная страница со списком моделей всех приложений или это страница с моделями одного приложения.
Данный тег надо вставить в шаблон интерфейса администратора. Для этого копируем шаблон django/contrib/admin/templates/admin/index.html в template/admin. Приведу diff правок:
--- index.html.orig 2009-05-29 22:51:50.000000000 +0400
+++ index.html 2010-10-19 19:40:48.000000000 +0400
@@ -1,5 +1,6 @@
{% extends "admin/base_site.html" %}
{% load i18n %}
+{% load model_desc %} {# my tag, check source code #}
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% load adminmedia %}{% admin_media_prefix %}css/dashboard.css" />{% endblock %}
@@ -16,14 +17,23 @@
{% for app in app_list %}
<div class="module">
<table summary="{% blocktrans with app.name as name %}Models available in the {{ name }} application.{% endblocktrans %}">
- <caption><a href="{{ app.app_url }}" class="section">{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}</a></caption>
+ <caption><a href="{{ app.app_url }}" class="section">{{ app.name }}</a></caption>
{% for model in app.models %}
<tr>
- {% if model.perms.change %}
- <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
- {% else %}
- <th scope="row">{{ model.name }}</th>
- {% endif %}
+ <th scope="row">
+ <div>
+ {% if model.perms.change %}
+ <a href="{{ model.admin_url }}">{{ model.name }}</a>
+ {% else %}
+ {{ model.name }}
+ {% endif %}
+ </div>
+
+ <div style="font-size:75%;">
+ {% model_desc model.admin_url app.name.lower %}
+ </div>
+ </th>
+
{% if model.perms.add %}
<td><a href="{{ model.admin_url }}add/" class="addlink">{% trans 'Add' %}</a></td>
Как видите, мы передаём в созданный тег url и имя приложения.
Пример описания стандартных моделей:
# admin.py
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User as UserModel, Group as GroupModel
class __User(UserAdmin):
list_display = ('username', 'group_list', 'last_name', 'first_name', 'email', 'is_staff', 'is_active')
def group_list(self, obj):
return ','.join(g.name for g in obj.groups.all())
group_list.short_description = _(u'Groups')
admin.site.unregister(UserModel)
admin.site.register(UserModel, __User)
UserModel.model_desc = _(u'Users of this system.')
GroupModel.model_desc = _(u'User groups of this system.')
Обратите внимание на последние строки.
Вот так будет выглядеть интерфейс после применения описанных действий.