Search
Write a publication
Pull to refresh

Django WYSIWYG + менеджер файлов. Простое решение

Я видел статью по прикручиванию TinyMCE к Django, но мне кажется есть путь намного проще и правильние(субъективно).

Нам понадобится:
  • Python массового перехода к 2.7 пока не замечено, так что будем использовать 2.6.х, а 3+ версию Django не поддерживает
  • Django
  • PIL библиотека питона для работы с графическими файлами
  • Subversion (svn) для установки grappelli и filebrowser


Подробности установки описывать не будем, перейдем сразу к нашей задаче.

Создадим чистый проект Django:

django-admin.py startproject wysiwyg

В директории wysiwyg выполним:

svn checkout http://django-filebrowser.googlecode.com/svn/trunk/filebrowser/ filebrowser
svn checkout http://django-grappelli.googlecode.com/svn/trunk/grappelli/ grappelli

Этим самым мы установили менеджер файлов и библиотеку «рюшечек» для Django.

Grappelli использует собственные css, изображения и JavaScript (jQuery и TinyMCE). Поэтому нам необходимо вынести их в отдельный каталог, который не будет обрабатывать встроенный сервер Django(во время разработки, а в будующем Apache, Nginx и ...).

В директории wysiwyg создадим каталог media, в который скопируем(перенесем, сделаем симлинк) данные из grappelli/media. Также у менеджера файлов есть свои файлы которые мы скопируем из filebrowser/media/filebrowser в media/filebrowser. Создадим в media каталог data, в него мы будем заливать файлы через наш файловый менеджер.

Для доступа в админку нам нужно настроить подключение к одной из баз данных поддерживаемых Django(MySQL, PostgreSQL, Oracle, SQLite3) в settings.py, также неубходимо установить модули питона для работы с этими базами данных, лично я использую PostgreSQL и psycopg2. Должно получиться что-то в духе, если сервер базы данных стоит у вас на компьютере:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'wysiwyg',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': '',
        'PORT': '',
    }
}


Дальше нам необходимо в том же settings.py в кортеже INSTALLED_APPS расскоментировать 'django.contrib.admin', — тем самым мы установили приложение админки Django. В urls.py расскоментировать from django.contrib import admin и admin.autodiscover() и (r'^admin/', include(admin.site.urls)), — этим мы связали приложение админки с «ссылкой, роутом»(кому как удобно) admin/. Теперь надо создать в базе данных таблици от нашей админки и нового «суперпользователя»:

python manage.py syncdb

Приступим к установке grappelli. В settings.py в кортеже INSTALLED_APPS перед 'django.contrib.admin', добавим 'grappelli', и создадим новый кортеж:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth",
    "django.core.context_processors.request",
)


В urls.py где мы расскоментировали (r'^admin/', include(admin.site.urls)), добавим (r'^grappelli/', include('grappelli.urls')),

Самое время посмотреть как выглядит наша админка, кстати теперь запускать ее надо не как всегда:

python manage.py runserver --adminmedia=media

Зайдем в нашем любимом браузере на http://localhost:8000/admin/ и полюбуемся новым видом нашей админки.

Приступим к установке filebrowser. Здесь все по аналогии с grappelli, urls.py добавим (r'^admin/filebrowser/', include('filebrowser.urls')), и в settings.py в INSTALLED_APPS добавим 'filebrowser',. Выставим следующие значение для MEDIA_URL и MEDIA_ROOT и добавим новый параметр FILEBROWSER_DIRECTORY:

MEDIA_ROOT = '/путь/к/папке/на/диске/wysiwyg/media/'
MEDIA_URL = 'http://localhost:8000/media/'
FILEBROWSER_DIRECTORY = 'data/'

В filebrowser/settings.py уберем исключение, которое используется если мы бы использовали django-tinymce и подправим DEFAULT_PATH_TINYMCE:

было
# settings for django-tinymce
try:
    import tinymce.settings
    DEFAULT_URL_TINYMCE = tinymce.settings.JS_BASE_URL + '/'
    DEFAULT_PATH_TINYMCE = tinymce.settings.JS_ROOT + '/'
except ImportError:
    DEFAULT_URL_TINYMCE = settings.ADMIN_MEDIA_PREFIX + "tinymce/jscripts/tiny_mce/"
    DEFAULT_PATH_TINYMCE = os.path.join(settings.MEDIA_ROOT, 'tinymce/jscripts/tiny_mce/')


стало
DEFAULT_URL_TINYMCE = settings.ADMIN_MEDIA_PREFIX + "tinymce/jscripts/tiny_mce/"
DEFAULT_PATH_TINYMCE = os.path.join(settings.MEDIA_ROOT, 'tinymce/jscripts/tiny_mce/')

Любуемся результатом http://localhost:8000/admin/filebrowser/browse/

Создадим новое приложение html

python manage.py startapp html

Отредактируем html/models.py, добавим в него

class html(models.Model):
    html = models.TextField()


Создадим html/amin.py с следуюшим содержанием

from django.contrib import admin
from html.models import *

class htmlAdmin(admin.ModelAdmin):
    class Media:
        js = ['/media/tinymce/jscripts/tiny_mce/tiny_mce.js', '/media/tinymce_setup/tinymce_setup.js',]

admin.site.register(html, htmlAdmin)



Теперь осталось в settings.py в INSTALLED_APPS добавить 'html', и добавить новую талицу в нашу базу данных:

python manage.py syncdb

Cкажу сразу, по дефолту в TinyMCE выбран немецкий язык, исправить это можно в media/tinymce_setup/tinymce_setup.js:

исправив
language:           "de",


на
language:           "en",



Полюбуватся результатом можно на http://localhost:8000/admin/html/html/add/

Скрин:

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.