Не успел я написать про административный интерфейс в Django, как произошло
радостное событие — он сильно изменился, став еще лучше. Поэтому не вижу смысла описывать старую функциональность и расскажу про новый вариант.
Для использования newforms-admin необходимо:
- Обновить Django, выполнив следующие команды в директории с рабочей копией (полученной при помощи svn checkout).
svn up
python setup.py install
- Удалить все блоки class Admin: pass из файла default/models.py
Что это
Админка — это автоматически генерируемое средство для управления моделями вашего приложения. Она обладает большими возможностями по настройке под нужды конкретного приложения. В нашем случаем мы могли бы использовать админку для:
- Модерации постов и комментариев
- Создании и удалении пользователей, причем при удалении автоматически удаляются все зависимые от пользователя объекты: профайл, сообщения и комментарии.
- Блокирования пользователей
- Просмотра статистики зарегистрированных пользователей, количества постов и комментариев.
Административный интерфейс в Django не только является инструментом разработчика, но и полностью готово для использования при эксплуатации сайтов. В своем php-проекте на работе нам пришлось писать админку самим, причем почти все существующие и планируемые функции повторяют функциональность Django-админки.
Объекты ModelAdmin
Админка описывается в файле admin.py при помощи специальных объектов ModelAdmin, различные поля этих объектов позволяют управлять функциональностью.
Например создадим ModelAdmin для записи в блоге:
class PostAdmin(admin.ModelAdmin):
pass
admin.site.register(Post, PostAdmin)
последняя строка говорит Django о том, что мы хотим использовать класс PostAdmin для описания админки класса Post.
Сгенерированный интерфейс будет выглядеть так:

Немного приукрасим его, сгрупировав поля:
class PostAdmin(admin.ModelAdmin):
fieldsets = (
(None, {
'fields': ('blog', 'poster', 'posted')
}),
('Содержимое', {
'fields': ('draft', 'caption', 'content')
})
)

Для тэгов к записи можно было объявить такие же объекты, но они появлялись бы в отдельном списке и редактировались по одному, что, согласитесь, не очень удобно. Встроим редактирование тегов в редактирование поста, при помощи специального класса InlineModelAdmin:
class TagInline(admin.TabularInline):
model = Tag
class PostAdmin(admin.ModelAdmin):
...
inlines = [
TagInline,
]
Вот такой блок добавится к редактированию поста в результате:

Файл
admin.py для всех моделей:
from coblog.default.models import *
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from django.contrib import admin
class BlogAdmin(admin.ModelAdmin):
pass
class TagInline(admin.TabularInline):
model = Tag
class CommentInline(admin.StackedInline):
model = Comment
fieldsets = (
(None, {
'fields': (('user', 'parent'), 'content'),
'classes': ['collapse']
}),
)
class PostAdmin(admin.ModelAdmin):
fieldsets = (
(None, {
'fields': ('blog', 'poster', 'posted')
}),
('Содержимое', {
'fields': (('caption','draft'), 'content')
})
)
inlines = [
TagInline,
CommentInline
]
class ProfileInline(admin.StackedInline):
model = Profile
extra = 0
max_num = 1
#Расширим стандартный интерфейс редактирования пользователя нашим профайлом
class MyUserAdmin(UserAdmin):
inlines = [
ProfileInline
]
#перерегистрируем админку для пользователя
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
admin.site.register(Blog, BlogAdmin)
admin.site.register(Post, PostAdmin)
Подлючение
Для активации админки исправим
urls.py:
from django.conf.urls.defaults import *
from django.contrib import admin
#автоматическое подключение необходимых приложений
admin.autodiscover()
urlpatterns = patterns('',
# Example:
# (r'^coblog/', include('coblog.foo.urls')),
# Uncomment this for admin:
('^admin/(.*)', admin.site.root),
)
Можете запустить сервер и посмотреть на результат:
python manage.py runserver