Крошечные всплывающие окна MCE в Django admin - PullRequest
16 голосов
/ 21 февраля 2009

У меня есть tinyMCE, работающий в админке django, но все всплывающие окна пусты (например, редактировать HTML, добавить изображение)

Все пути к всплывающим html-страницам находятся в нужных местах

http://thatch.media/js/tiny_mce/themes/advanced/source_editor.htm?mce_rdomain=thatch

Для всей папки js установлены разрешения 777

Это моя модель

class Page(models.Model):
    title = models.CharField(max_length=200)
    ...

    class Admin:
        js = ('js/tiny_mce/tiny_mce.js', 'js/textareas.js')

Есть идеи?

Ответы [ 10 ]

19 голосов
/ 14 сентября 2011

Я тоже столкнулся с этой проблемой, используя корзину Amazon S3 для хранения статических носителей, включая JavaScript TinyMCE.

Чтобы быть более точным - ваш статический носитель должен находиться на поддомене вашего основного сайта. Итак, если ваш сайт работает на foo.bar.com - ваш статический носитель должен быть на чем-то вроде static.foo.bar.com - обратите внимание, что static.bar.com и static-foo.bar.com НЕ будут Хорошо. (Если ваш сайт на bar.com, то static.bar.com в порядке.)

Итак, как только ваш статический носитель подается из субдомена (для S3 см. Amazon S3: статические веб-сайты: пользовательский домен или субдомен , который мне помог), вам нужно установить document.domain в JavaScript в двух местах:

1) В tiny_mce_popup.js

2) В tiny_mce.js, прежде чем что-либо еще, или, в качестве альтернативы, в визуализированном HTML вашей главной страницы в теге скрипта где-то до вызова tiny_mce.init () (Мне показалось более целесообразным взломать tiny_mce.js и повторно загрузить его в S3, а не копаться в рендеринге виджетов django-tinymce.)

Вам необходимо установить document.domain в качестве домена ГЛАВНОГО САЙТА в обоих местах: поэтому для сайта на foo.bar.com со статическим носителем на static.foo.bar.com вам нужно будет установить документ. domain = "foo.bar.com"

Это должно предотвратить любые исключения безопасности в браузере, и теперь все будет работать правильно.

12 голосов
/ 14 апреля 2012

Я столкнулся с этой проблемой при запуске моего приложения django на Heroku и использовании Rackspace CDN. Мои настройки статического файла были настроены на использование Rackpace CDN для обмена файлами

  • решение состояло в том, чтобы использовать обычную статическую обработку файлов для конкретных файлов tinymce:

    class Media:
    js = [
        '/static/grappelli/tinymce/jscripts/tiny_mce/tiny_mce.js',
        '/static/grappelli/tinymce_setup/tinymce_setup.js',
    ]
    

В моем url conf:

urlpatterns += patterns('',
    url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
        'document_root': settings.STATIC_ROOT,
    }),

)

Функция static.serve позволяет обслуживать статические файлы вне стандартных статических настроек. Вы можете изменить static в url conf на все, что захотите.

6 голосов
/ 21 июля 2009

Если это версия TinyMCE для JQuery, и вы отправляете мультимедиа (включая файлы TinyMCE .js) с другого сервера на тот, на котором работает Django, это может применяться: ваш браузер будет препятствовать доступу сценария TinyMCE URL администратора Django из домена, с которого обслуживается TinyMCE. Консоль ошибок Safari является наиболее явной, например ::10000

Unsafe JavaScript attempt to access frame with URL http://127.0.0.1/~whatever/django-templates/javascript/tiny_mce/jscripts/more stuffhere/anchor.htm
from frame with URL http://127.0.0.1:8000/admin/flatpages/flatpage/1/.
Domains, protocols and ports must match.

В файле tiny_mce_popup.js есть настройка, которая гласит:

// Uncomment and change this document.domain value if you are loading the script cross subdomains
// document.domain = 'moxiecode.com';

но у меня это не сработало. Вы можете попробовать нарушить правила и обслуживать сценарии TinyMCE с сервера Django или добавить сценарии в HTML-код ваших измененных шаблонов администратора ... но я уверен, что есть лучшее решение. У меня кончилось терпение, и я уверен, что это было сделано, но я не могу найти решение, чтобы заставить TinyMCE работать в разных доменах.

Тем не менее, из-за отвратительного HTML / встроенного CSS, который пользователи могут создавать с помощью визуальных редакторов, другие решения могут быть лучше: Текстиль (Redcloth Руби дает визуальная обратная связь - возможно, есть аналогичная реализация Python, основанная на PyTextile или Python-Textile ??), или markItUp! (JQuery, поэтому может представлять ту же проблему), которая имеет приятный визуальный элемент панель инструментов редактирования.

Если вы сомневаетесь в этом отойдите от словесных редакторов , <- эта ссылка - хорошая статья по этому вопросу. </p>

Постскриптум: есть замечательная реализация Markdown в Javascript в WMD , которая предлагает панель инструментов, подобную TinyMCE, в стиле семантической разметки (wysiwym - «то, что вы видите, это то, что вы имеете в виду * 1029») * ') редактор ярлыков. GitHub использует соответствующее решение .

5 голосов
/ 10 февраля 2013

Я обнаружил, что лучшее решение - просто обслуживать носители tiny_mce из корневого каталога проекта или из каталога dir, установив:

TINYMCE_JS_URL = '%stiny_mce/tiny_mce.js' % MEDIA_URL
3 голосов
/ 10 марта 2009

Проверьте ваш MEDIA_URL в вашем файле настроек. Если это не относительный путь, то есть http://site.com/media_url, как рекомендует Django, tiny_mce будет отображать пустые страницы. Установите это на относительный путь, и он должен работать.

Подробнее см. http://pageworthy.com/blog/2009/mar/09/tiny_mce-blank-popups/.

2 голосов
/ 05 июля 2011

У меня была проблема с пустым всплывающим окном. В моем случае проблемы были в другом поддомене. Не уверен, что это ваш случай.

я решил путем редактирования tiny_mce_popup.js и добавление

document.domain = window.location.hostname.replace('static.','');

Конечно, замените static своим поддоменом, чтобы строка "domain.com"

Затем снова определите document.domain, прежде чем присоединять .tinymce (...) к своим элементам. В зависимости от того, где вы находитесь, вы можете использовать для этого сценарий на стороне сервера или тот же код, что и выше. Смотрите вики с сайта здесь http://tinymce.moxiecode.com/wiki.php/How-to_load_TinyMCE_crossdomain

1 голос
/ 14 августа 2015

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

Итак ... ваш код был загружен в heroku, откуда вы пытались открыть .js, который использовал всплывающее окно TinyMCE, но статические файлы (то есть .js, используемый во всплывающем окне) были загружены на другой хост ( в моем случае S3).

Итак, я немного исследовал и нашел это решение: https://devcenter.heroku.com/articles/django-assets Который, кстати, работал как шарм, и мой проект уже работал!

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

1 голос
/ 17 июля 2009

Возникла та же проблема, я использую Amazon S3 для всех js / css и т. Д., Поэтому относительные URL-адреса были недоступны.

Чтобы это работало, мне пришлось отредактировать - tiny_mce_popup.js и tiny_mce.js, добавив следующую строку вверху:

document.domain = 'moxie.org';

Надеюсь, это поможет ...

1 голос
/ 21 февраля 2009

Я изменил носитель с http://thatch.media на http://thatch/media и теперь это работает

Может быть, это связано с тем, что вы находитесь в разных доменах?

0 голосов
/ 22 октября 2009

Вы также должны изменить document.domain в tiny_mce_popups.js в своем конфигурационном файле. Процедуры описаны здесь:

http://wiki.moxiecode.com/index.php/TinyMCE:Cross_domain_loading

Надеюсь, эта помощь.

...