提问人:Cato Johnston 提问时间:2/21/2009 更新时间:8/15/2015 访问量:11906
Django admin 中的微小 MCE 弹出窗口空白
Tiny MCE popups blank in Django admin
问:
我在 django 管理中工作了 tinyMCE,但所有弹出窗口都是空白的 (例如,编辑 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')
有什么想法吗?
答:
我将媒体从 http://thatch.media 服务更改为 http://thatch/media,现在它可以工作了
也许与处于不同的领域有关?
评论
在设置文件中检查您的MEDIA_URL。如果将其设置为非相对路径,即 Django 建议的 http://site.com/media_url,tiny_mce将弹出空白页。将其设置为相对路径,它应该可以工作。
有关详细信息,请参阅 http://pageworthy.com/blog/2009/mar/09/tiny_mce-blank-popups/。
评论
有同样的问题,我将 Amazon S3 用于所有 js / css 等,因此相对 url 不是一种选择。
为了使它工作,我不得不编辑 - tiny_mce_popup.js 和 tiny_mce.js,在顶部添加了以下行:
document.domain = 'moxie.org';
希望这能帮助...
评论
如果这是 TinyMCE 的 JQuery 版本,并且您正在将媒体(包括 TinyMCE .js 文件)从另一台服务器提供给运行 Django 的服务器,这可能适用:您的浏览器将阻止 TinyMCE 脚本从提供 TinyMCE 的域访问 Django 管理 URL。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';
但它对我不起作用。你可以尝试打破规则,从 Django 服务器提供 TinyMCE 脚本,或者将脚本添加到你修改后的管理模板的 HTML 中......但我相信有更好的解决方案。我失去了耐心,虽然我确信它已经完成了,但我找不到让 TinyMCE 跨域工作的解决方案。
然而,由于用户可以使用可视化编辑器生成可怕的 HTML/内联 CSS 修改,其他解决方案可能会更好:Textile(Ruby 的 Redcloth 提供视觉反馈 - 也许有一个类似的基于 PyTextile 或 Python-Textile 的 Python 实现??),或者 markItUp!(JQuery,所以可能会出现同样的问题),它有一个很好的可视化编辑工具栏。
如果你怀疑这种远离“类似 Word”的编辑的举动,< - 该链接是关于这个问题的好文章。
后记:WMD 中有一个很好的 Markdown Javascript 实现,它提供了一个类似 TinyMCE 的工具栏、语义标记样式(所见即所得)编辑器快捷方式。GitHub 使用相关解决方案。
您必须更改 tiny_mce_popups.js 中的 document.domain 以及配置文件中的 document.domain。 这些过程描述如下:
http://wiki.moxiecode.com/index.php/TinyMCE:Cross_domain_loading
希望这有帮助。
我遇到了空白弹出窗口问题。就我而言,问题在于将它们放在另一个子域中。 不确定这是你的情况。
我通过编辑解决了 tiny_mce_popup.js 并添加
document.domain = window.location.hostname.replace('static.','');
当然,将 static 替换为您的子域以具有“domain.com”字符串
然后再次定义 document.domain,然后再将 .tinymce(...) 附加到元素。根据您所在的位置,您可以使用服务器端脚本或上面的相同代码。从网站上查看 wiki http://tinymce.moxiecode.com/wiki.php/How-to_load_TinyMCE_crossdomain
评论
'this.is.an.involve.domain.name'.split('.').splice(-2).join('.')
document.domain = window.location.hostname.split('.').splice(-2).join('.');
我也遇到了这个问题,使用 Amazon S3 存储桶来存储静态媒体,包括 TinyMCE javascript。
更明确地说,静态媒体必须位于主站点的子域中。因此,如果你的网站以 foo.bar.com 运行——你的静态媒体必须位于类似 static.foo.bar.com 上——请注意,static.bar.com 和 static-foo.bar.com 是不行的。(如果你的网站在 bar.com 那么 static.bar.com 就可以了。
因此,一旦您从子域中提供静态媒体(对于 S3,请参阅 Amazon S3:静态网站:自定义域或子域,这对我有帮助),您就需要在 javascript 中的两个位置设置 document.domain:
1) 在tiny_mce_popup.js
2) 在 tiny_mce.js 之前,或者,在 tiny_mce.init() 调用发生之前的某个位置的脚本标签中,在主页的 HTML 中呈现。(我发现破解tiny_mce.js并将其重新上传到 S3 更方便,而不是用 django-tinymce 的小部件渲染来搞砸。
您需要在这两个地方将 document.domain 设置为主站点的域:因此,对于静态媒体位于 static.foo.bar.com 的 foo.bar.com 站点,您需要设置 document.domain = “foo.bar.com”
这应该可以防止浏览器中出现任何安全异常,现在一切都可以正常工作。
评论
document.domain = "mymainsite.com";
<script type="text/javascript">document.domain = 'foo.bar.com';</script>
我在 Heroku 上运行我的 django 应用程序并使用 Rackspace CDN 时遇到了这个问题。我的静态文件设置都设置为使用 rackspace 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 函数允许您在标准静态设置之外提供静态文件。您可以将 url conf 中的 static 更改为您想要的任何内容。
评论
Alias
/static/js/libs/tiny_mce/
)
我发现最好的解决方案是通过设置从项目根目录或媒体目录提供tiny_mce媒体:
TINYMCE_JS_URL = '%stiny_mce/tiny_mce.js' % MEDIA_URL
评论
TINYMCE_JS_ROOT
我输入了你的答案,因为我遇到了同样的问题。第一个答案帮助我理解了问题,但不能解决问题。
所以。。。您已将代码上传到 Heroku,从那里尝试打开使用 TinyMCE 弹出窗口的.js,但静态文件(因此弹出窗口使用的 .js)已上传到另一台主机(在我的例子中是 S3)。
所以我稍微调查了一下,找到了这个解决方案: https://devcenter.heroku.com/articles/django-assets 顺便说一句,它就像一个魅力,我的项目已经工作了!
因此,基本上,您所做的就是将静态文件和代码上传到同一位置,这样您就不会违反同源策略。
评论