LINUX.ORG.RU

Django + ckeditor

 


0

1

Хочу интегрировать ckeditor в формы django. Делаю все по инструкции https://github.com/shaunsephton/django-ckeditor

Но на шаге - ./manage.py collectstatic вылетает с ошибкой:

OSError: [Errno 13] Permission denied: '/static'

В чём может быть проблема? Уже и права на каталог static сделал = 777, всё равно выскакивает такая ошибка.

Мой settings.py:

# -*- coding: utf-8 -*-
import os.path
import os
import cbsettings
from cbsettings import DjangoDefaults, switcher

_ROOT = os.path.abspath(os.path.dirname(__file__))

class Base(DjangoDefaults):


    DEBUG = TEMPLATE_DEBUG = False

    # Задаются в local_settings
    #
    SECRET_KEY = ""

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': 'var/data.db',
        }
    }

    FIXTURE_DIRS = (
    )

    TIME_ZONE = 'Europe/Moscow'

    LANGUAGE_CODE = 'ru'

    SITE_ID = 1

    USE_I18N = USE_L10N = True

    MEDIA_ROOT = './var/media'

    MEDIA_URL = '/media/'

    UPLOAD_TO = os.path.join(MEDIA_ROOT)

    STATICFILES_DIRS = (
        ("", os.path.join(_ROOT, 'core/static/')),
    )

    STATIC_URL = '/static/'
    STATIC_ROOT = '/static/'

    CKEDITOR_UPLOAD_PATH = "project/core/uploads"

    TEMPLATE_LOADERS = (
        'django.template.loaders.filesystem.Loader',
        'django.template.loaders.app_directories.Loader',
        'django.template.loaders.eggs.Loader',
    )

    MIDDLEWARE_CLASSES = (
        'django.middleware.common.CommonMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
    )

    TEMPLATE_CONTEXT_PROCESSORS = (
        'django.contrib.auth.context_processors.auth',
        'django.core.context_processors.debug',
        'django.core.context_processors.i18n',
        'django.core.context_processors.media',
        'django.core.context_processors.static',
        'django.contrib.messages.context_processors.messages',
        'django.core.context_processors.request',
        'project.structure.context_processors.current_node',
    )

    ROOT_URLCONF = 'project.urls'

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        }
    }


    TEMPLATE_DIRS = (
        os.path.join(_ROOT, 'templates'),
    )

    LOGIN_URL = '/accounts/login'
    LOGOUT_URL = '/accounts/logout'

    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.admin',
        'django.contrib.staticfiles',
        'ckeditor',
        'mptt',
        'project.core',
        'project.structure',
        'project.main',

    )

class Dev(Base):
    DEBUG = True
    TEMPLATE_DEBUG = DEBUG
    SECRET_KEY = "sdsadasdasdasdas="
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': './var/data.db',
        }
    }

class Prod(Base):
    SECRET_KEY = "asdsad30e23093uiojrlkwkewe="
    DEBUG = False
    TEMPLATE_DEBUG = DEBUG



import sys
pathname, scriptname =  os.path.split(sys.argv[0])
_PATH = os.path.abspath(pathname)


switcher.register(Dev, lambda: os.path.exists(  os.path.join(_PATH, ".dev" )))
switcher.register(Prod, lambda: os.path.exists(  os.path.join(_PATH, ".prod" )))
switcher.register(Prod, hostnames=['example.com'])
switcher.register(Dev, lambda: not (os.path.exists(  os.path.join(_PATH, ".dev" ) or os.path.exists(  os.path.join(_PATH, ".dev" ) )   )) )

Поможите чем можите). Заранее спасибо.


Permission denied: '/static'

Туда и пытается писать. Попробуй использовать *правильный* полный путь.

commit ★★
()
Ответ на: комментарий от commit

Попробовал ( «project/core/static/» ) - таже проблема. Странно, что если даже удалить секцию

STATICFILES_DIRS = (
        ("", os.path.join(_ROOT, 'core/static/')),
    )
возникает такая же ошибка. Что за мистика?

Sektor
() автор топика
Ответ на: комментарий от Sektor

Если core - приложение, не надо его добавлять в папки, там есть файндер который и так в них ищет. Это то откуда он из будет забирать.

STATIC_ROOT это то куда он будет их ложить, и у тебя там абсолютный путь /static/ когда должен быть путь/к/проекут/static

zz ★★★★
()
Ответ на: комментарий от zz

Настроил. collectstatic работает. Но в форме ckeditor не работает.

forms.py:

from django import forms
from ckeditor.widgets import CKEditorWidget

class CreatePostForm (forms.Form):
    ...
    body = CharField (widget=CKEditorWidget())

Вывожу форму в шиблоне - нет ckeditor'a. Делаю всё по вышеуказанной доке, но всё равно не работает. Как вообще «готовить» этот ckeditor с джангой?

Sektor
() автор топика
Ответ на: комментарий от Sektor

Тебя надо включить скрипт редактора, который автоматически добавляется только в админке. Например так: {{form.media}}. Это есть в ридми:

NOTE: If you're using custom views remember to include ckeditor.js in your form's media either through {{ form.media }} or through a <script> tag. Admin will do this for you automatically. See Django's Form Media docs for more info.

zz ★★★★
()
Ответ на: комментарий от zz

Я ж и говорю, что сделал всё как в доке.

Форму вывожу как {{ form.media }}, дже на всякий случай (хотя не знаю зачем) подключил js-скрипт ckeditor.js. И форма вообще не выводится - пусто (.

Sektor
() автор топика
Ответ на: комментарий от Sektor

Покажи html сгенерированный, шаблон и проверь что скрипт отдается по тому юрлу, который там получается.

zz ★★★★
()
Ответ на: комментарий от zz
>>> from ...forms import *
>>> f = MyFormName()
>>> print f.media

<scritp src="path_to/ckeditor/ckeditor/ckedotri.js"></script>

Урл js-ки верный, проверил несколько раз, но форма, всё равно не выводится(.

Sektor
() автор топика
Ответ на: комментарий от Sektor

Ну так покажи как ты форму выводишь, и что в результате в html видишь. Можешь вьюху прихватить сразу заодно :)

zz ★★★★
()
Ответ на: комментарий от zz

Пока не решил(.

В шаблоне форму вывожу как {{ form.media }}.

Вот, что получаю, когда вывожу форму:

<tr><th><label for="id_title">Заголовок поста (максимум 100 символов):</label></th><td><input id="id_title" type="text" name="title" maxlength="100" /></td></tr>
<tr><th><label for="id_teaser">Аннонс поста:</label></th><td><textarea id="id_teaser" rows="10" cols="40" name="teaser"></textarea>
<script type="text/javascript">
    CKEDITOR.replace("id_teaser", {"filebrowserWindowWidth": 940, "width": 960, "skin": "django", "filebrowserWindowHeight": 725, "filebrowserBrowseUrl": "/ckeditor/browse/", "filebrowserUploadUrl": "/ckeditor/upload/", "toolbar": "Full", "height": 300});
</script>
</td></tr>
<tr><th><label for="id_text">Основной контент:</label></th><td><textarea id="id_text" rows="10" cols="40" name="text"></textarea>
<script type="text/javascript">
CKEDITOR.replace("id_text", {"filebrowserWindowWidth": 940, "width": 960, "skin": "django", "filebrowserWindowHeight": 725, "filebrowserBrowseUrl": "/ckeditor/browse/", "filebrowserUploadUrl": "/ckeditor/upload/", "toolbar": "Full", "height": 300});
</script>
</td></tr>
<tr><th><label for="id_category">Категория:</label></th><td><select name="category" id="id_category">
</select></td></tr>
<tr><th><label for="id_tag">Теги:</label></th><td><input id="id_tag" type="text" name="tag" maxlength="100" /></td></tr>

Вы это имели в виду?

Sektor
() автор топика
Ответ на: комментарий от zz

В консоле нет ни ошибок, ни дже предупреждений. И проект выложить на хостинг сейчас не могу. Но вот что примечательно, когда обновляю страницу с формой (которая не выводится) в браузере, в консольке python появляется строка:

"GET /create_post/ HTTP/1.1" 200 3241

А должен быть статус 500 :(.

Sektor
() автор топика

Разобрался наконец-то. Тупил я жёстко:(. Оказывается в шаблоне, при выводе формы нужно писать не только {{ you_form.media }}, но и, следом за этим, обычный вывод формы - {{ you_form.as_p(or as_ul, or as_table }}.

Sektor
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.