Приветствую {% habrauser %}!
Так уж сложилось, что рано или поздно каждый из web-разработчиков выпускающий свои проекты на не безызвестном Django Framework приходит к решению, что с родной Django-админкой надо что-то делать, ибо оная не самое привлекательное и функциональное решение под конечного пользователя. Да и рукодельничать надоедает в виде кастомных TreeSelectorWidget и т.п костылями.
После недолго гугления на тему сторонних оболочек для кастомизации django-админки у нас на руках имеется пара вполне вменяемых решений django-grappelli и django-admin-tools, о котором уже имеются повествования на хабре Улучшаем админку, а так же о способе как подружить admin-tools с Twitter Bootstrap Django Admin Bootstrap Theme и еще множество как визуальных, как и чисто функциональных решений…
И вот буквально вчера один из коллег мне подкинул ссылку на новенькую админку основанной на Twitter Bootstrap, о которой как не странно нет ни слова на хабре.
Для начала хочу привести примеры интерфесов всех описанных выше админок начиная от самой родной и заканчивая самой человечной на мой взгляд:




А теперь к делу:
Установка и настройка django-suit сводится к самой установке и добавлением трех строчек в settings.py
settings.py
Это минимум, что от Вас требуется чтобы начать получать удовольствие от новой админки, но этого нам явно мало…
Создадим пару моделей над которыми будемиздеваться экспериментировать дальше
models.py
admin.py
и получаем красивое плоское дерево категорий

и не менее красивую и плоскую страницу редактирования

Первым делом я решил преобразить страницу редактирования поместив смысловые блоки в табы. Для этото приложим совсем немного усилий и подправим регистрацию моделей
admin.py

После чего захотелось мне сделать дерево более наглядным с помошью django-mptt
Редактируем наши модели и мигрируемся:
(оставил только изменения, остальное опустил)
admin.py
так-то лучше, но и это не предел.

Теперь займемся самым сложным — прикручиванием wysiwyg-редактора CKEdiror
и поправим код:
settings.py
admin.py

С этим все понятно скажете Вы, а как же кастомные виджеты из admin-tools от них придется отказаться?
А вот и нет, отвечу я.
редактируем наш settings.py и дописываем следующее:
после чего наше меню изменится и будет выглядеть следующим образом

теперь создадим вьюшку и пропишем 2 url один будет доступен всем желаюшим другой только тем у кого есть доступ в админку
views.py
example.html
и наконец urls.py

Вот так легко и не принудженно за каких-то 30 минут админка преображается до неузнаваемости.
Всем кому стало интересно посмотреть руками максимум возможнотей этой замечательнйо на мой взгляд альтернативе всех предидущих админок: Wellcome на сайт разработчиков
P.S: Сильно не пинайте — это мой первый пост на хабре.
Так уж сложилось, что рано или поздно каждый из web-разработчиков выпускающий свои проекты на не безызвестном Django Framework приходит к решению, что с родной Django-админкой надо что-то делать, ибо оная не самое привлекательное и функциональное решение под конечного пользователя. Да и рукодельничать надоедает в виде кастомных TreeSelectorWidget и т.п костылями.
После недолго гугления на тему сторонних оболочек для кастомизации django-админки у нас на руках имеется пара вполне вменяемых решений django-grappelli и django-admin-tools, о котором уже имеются повествования на хабре Улучшаем админку, а так же о способе как подружить admin-tools с Twitter Bootstrap Django Admin Bootstrap Theme и еще множество как визуальных, как и чисто функциональных решений…
И вот буквально вчера один из коллег мне подкинул ссылку на новенькую админку основанной на Twitter Bootstrap, о которой как не странно нет ни слова на хабре.
Для начала хочу привести примеры интерфесов всех описанных выше админок начиная от самой родной и заканчивая самой человечной на мой взгляд:




А теперь к делу:
Установка и настройка django-suit сводится к самой установке и добавлением трех строчек в settings.py
pip install django-suit
settings.py
TEMPLATE_CONTEXT_PROCESSORS = ( 'django.contrib.auth.context_processors.auth', 'django.core.context_processors.request', ) INSTALLED_APPS = ( 'suit', # .... 'django.contrib.admin', )
Это минимум, что от Вас требуется чтобы начать получать удовольствие от новой админки, но этого нам явно мало…
Создадим пару моделей над которыми будем
models.py
#!/usr/bin/python # -*- coding: utf-8 -*- from django.db import models class Category(models.Model): title = models.CharField(max_length=128) seo_keywords = models.CharField(max_length=256, blank=True, null=True) seo_description = models.CharField(max_length=256, blank=True, null=True) parent = models.ForeignKey('self', blank=True, null=True, related_name='categories') preview_text = models.TextField(max_length=512, blank=True, null=True, default='') detail_text = models.TextField(max_length=10*1024, blank=True, null=True, default='') preview_image = models.ImageField(blank=True, null=True, upload_to='images') detail_image = models.ImageField(blank=True, null=True, upload_to='images') active = models.BooleanField(default=True) def __unicode__(self): return self.title class Meta: verbose_name = u'Категория товаров' verbose_name_plural = u'Категории товаров' class Product(models.Model): title = models.CharField(max_length=128) seo_keywords = models.CharField(max_length=256, blank=True, null=True) seo_description = models.CharField(max_length=256, blank=True, null=True) parent = models.ForeignKey(Category, blank=True, null=True, related_name='products') preview_text = models.TextField(max_length=512, blank=True, null=True) detail_text = models.TextField(max_length=10*1024, blank=True, null=True) preview_image = models.ImageField(blank=True, null=True, upload_to='images') detail_image = models.ImageField(blank=True, null=True, upload_to='images') price = models.FloatField(blank=True, null=True, default=0.0) sale = models.FloatField(blank=True, null=True, default=0.0) active = models.BooleanField(default=True) def __unicode__(self): return self.title class Meta: verbose_name = u'Товар' verbose_name_plural = u'Товары'
admin.py
#!/usr/bin/python # -*- coding: utf-8 -*- from django import forms from django.contrib import admin from django.contrib.admin import ModelAdmin, TabularInline from models import Category, Product, ProductSliderImage class AdminCategory(ModelAdmin): search_fields = ['title'] list_display = ['title', 'active'] list_filter = ('active',) class AdminProduct(ModelAdmin): search_fields = ['title'] list_display = ['title', 'active'] list_filter = ('active', 'parent') admin.site.register(Category, AdminCategory) admin.site.register(Product, AdminProduct)
и получаем красивое плоское дерево категорий

и не менее красивую и плоскую страницу редактирования

Первым делом я решил преобразить страницу редактирования поместив смысловые блоки в табы. Для этото приложим совсем немного усилий и подправим регистрацию моделей
admin.py
class AdminCategory(ModelAdmin): search_fields = ['title'] list_display = ['title', 'active'] list_filter = ('active',) fieldsets = ( (None, { 'classes': ('suit-tab suit-tab-general',), 'fields': (('title', 'active'), 'parent') }), ('Preview', { 'classes': ('suit-tab suit-tab-preview',), 'fields': ('preview_image', 'preview_text') }), ('Detail', { 'classes': ('suit-tab suit-tab-detail',), 'fields': ('detail_image', 'detail_text') }), ('Seo', { 'classes': ('suit-tab suit-tab-seo',), 'fields': ('seo_keywords', 'seo_description') }), ) suit_form_tabs = (('general', 'General'), ('preview', 'Preview'), ('detail', 'Detail'), ('seo', 'Seo'),)

После чего захотелось мне сделать дерево более наглядным с помошью django-mptt
Редактируем наши модели и мигрируемся:
(оставил только изменения, остальное опустил)
#!/usr/bin/python # -*- coding: utf-8 -*- from django.db import models from mptt.models import MPTTModel, TreeForeignKey class Category(MPTTModel): .... parent = TreeForeignKey('self', blank=True, null=True, related_name='categories') .... class Product(models.Model) .... parent = TreeForeignKey(Category, blank=True, null=True, related_name='products') ...
admin.py
from mptt.admin import MPTTModelAdmin class AdminCategory(MPTTModelAdmin): ....
так-то лучше, но и это не предел.

Теперь займемся самым сложным — прикручиванием wysiwyg-редактора CKEdiror
pip install django-suit-ckeditor ./manage.py collectstatic --noinout
и поправим код:
settings.py
INSTALLED_APPS = ( 'suit', 'suit_ckeditor', # .... 'django.contrib.admin', )
admin.py
from django.db import models from suit_ckeditor.widgets import CKEditorWidget class AdminCategory(MPTTModelAdmin): formfield_overrides = { models.TextField: {'widget': CKEditorWidget}, } ... class AdminProduct(ModelAdmin): formfield_overrides = { models.TextField: {'widget': CKEditorWidget}, } ...

С этим все понятно скажете Вы, а как же кастомные виджеты из admin-tools от них придется отказаться?
А вот и нет, отвечу я.
редактируем наш settings.py и дописываем следующее:
# Django Suit configuration example SUIT_CONFIG = { "MENU": ( {'label': "Example", "icon": 'icon-ok', "models": [ {"label": "for all", 'url': '/example/'}, {"label": "for stuff", 'url': '/admin/example/'}, ]}, ) }
после чего наше меню изменится и будет выглядеть следующим образом

теперь создадим вьюшку и пропишем 2 url один будет доступен всем желаюшим другой только тем у кого есть доступ в админку
views.py
#!/usr/bin/python # -*- coding: utf-8 -*- from django.views.generic.base import TemplateView class ExampleView(TemplateView): template_name = 'example.html' def get_context_data(self, **kwargs): kwargs['title'] = "Привет Хабр!" return super(ExampleView, self).get_context_data(**kwargs)
example.html
{% extends 'admin/base.html' %} {% block content %} <h1>Привет Habrahabr.ru</h1> {% endblock %}
и наконец urls.py
urlpatterns = patterns('', # Examples: url(r'^example/$', ExampleView.as_view()), url(r'^admin/example/$', ExampleView.as_view()), .... )

Вот так легко и не принудженно за каких-то 30 минут админка преображается до неузнаваемости.
Всем кому стало интересно посмотреть руками максимум возможнотей этой замечательнйо на мой взгляд альтернативе всех предидущих админок: Wellcome на сайт разработчиков
- Офф сайт http://djangosuit.com/
- Демо на сайте разработчиков login/password: demo/demo
- Документация
- проект на GitHub
P.S: Сильно не пинайте — это мой первый пост на хабре.