Крошечные всплывающие окна MCE в Django admin

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

Все пути к всплывающим HTML-страницам существуют в нужных местах.

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

Разрешения установлены на 777 для всей папки JS

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

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

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

Есть идеи?

10 ответов

Решение

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

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

Я тоже столкнулся с этой проблемой, используя корзину 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 вам нужно будет установить document.domain = "foo.bar.com"

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

Я столкнулся с этой проблемой при запуске приложения 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 на что угодно.

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

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/inline CSS, который пользователи могут создавать с помощью визуальных редакторов, другие решения могут быть лучше: Textile (Redcloth от Ruby дает визуальную обратную связь - возможно, есть похожая реализация Python, основанная на PyTextile или Python-Textile??), или markItUp! (JQuery, поэтому может представлять ту же проблему), которая имеет хорошую визуальную панель инструментов редактирования.

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

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

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

TINYMCE_JS_URL = '%stiny_mce/tiny_mce.js' % MEDIA_URL

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

Смотрите http://pageworthy.com/blog/2009/mar/09/tiny_mce-blank-popups/ для более подробной информации.

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

Я решил, отредактировав 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

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

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

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

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

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

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

document.domain = 'moxie.org';

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

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

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

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

Другие вопросы по тегам