Django admin 中的微小 MCE 弹出窗口空白

Tiny MCE popups blank in Django admin

提问人:Cato Johnston 提问时间:2/21/2009 更新时间:8/15/2015 访问量:11906

问:

我在 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')

有什么想法吗?

django django-admin tinymce

评论


答:

1赞 Cato Johnston 2/21/2009 #1

我将媒体从 http://thatch.media 服务更改为 http://thatch/media,现在它可以工作了

也许与处于不同的领域有关?

评论

0赞 Mohamed 8/7/2009
是的,浏览器实现了称为同源策略的安全功能,这意味着页面将有权访问与页面源自同一域的所有脚本。这是解释同源策略的 wiki 链接。en.wikipedia.org/wiki/Same_origin_policy
3赞 user75977 3/10/2009 #2

在设置文件中检查您的MEDIA_URL。如果将其设置为非相对路径,即 Django 建议的 http://site.com/media_url,tiny_mce将弹出空白页。将其设置为相对路径,它应该可以工作。

有关详细信息,请参阅 http://pageworthy.com/blog/2009/mar/09/tiny_mce-blank-popups/

评论

0赞 Greg Humphreys 2/23/2012
几个月来我一直在寻找这篇文章。最后,谢谢。
1赞 Kapil Bharati 7/17/2009 #3

有同样的问题,我将 Amazon S3 用于所有 js / css 等,因此相对 url 不是一种选择。

为了使它工作,我不得不编辑 - tiny_mce_popup.js 和 tiny_mce.js,在顶部添加了以下行:

document.domain = 'moxie.org';

希望这能帮助...

评论

0赞 Adam Spence 9/4/2013
这样做的问题是,当您下次运行 collectstatic 命令时,它将被覆盖
6赞 Dave Everitt 7/21/2009 #4

如果这是 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 提供视觉反馈 - 也许有一个类似的基于 PyTextilePython-Textile 的 Python 实现??),或者 markItUp!(JQuery,所以可能会出现同样的问题),它有一个很好的可视化编辑工具栏。

如果你怀疑这种远离“类似 Word”的编辑的举动,< - 该链接是关于这个问题的好文章。

后记:WMD 中有一个很好的 Markdown Javascript 实现,它提供了一个类似 TinyMCE 的工具栏、语义标记样式(所见即所)编辑器快捷方式。GitHub 使用相关解决方案

0赞 Alfredo Di Napoli 10/23/2009 #5

您必须更改 tiny_mce_popups.js 中的 document.domain 以及配置文件中的 document.domain。 这些过程描述如下:

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

希望这有帮助。

2赞 E Ciotti 7/5/2011 #6

我遇到了空白弹出窗口问题。就我而言,问题在于将它们放在另一个子域中。 不确定这是你的情况。

我通过编辑解决了 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

评论

0赞 mkoistinen 11/19/2012
我使用:==>“domain.name”。调整参数以拼接,以确保零件数量符合您的要求。所以:'this.is.an.involve.domain.name'.split('.').splice(-2).join('.')document.domain = window.location.hostname.split('.').splice(-2).join('.');
19赞 ejucovy 9/14/2011 #7

我也遇到了这个问题,使用 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”

这应该可以防止浏览器中出现任何安全异常,现在一切都可以正常工作。

评论

0赞 Brent O'Connor 5/31/2013
添加到以下文件的顶部...mybucket.s3.amazonaws.com/static/grappelli/tinymce/jscripts/...... mybucket.s3.amazonaws.com/static/grappelli/tinymce/jscripts/......还是行不通......我在弹出窗口的控制台中收到一个新错误,即......未捕获的错误:SecurityError:DOM 异常 18 tiny_mce_popup.js:3 未捕获的 TypeError:无法调用未定义source_editor.js的方法“requireLangPack”:1 我使用的是 Chrome 版本 27.0.1453.93。document.domain = "mymainsite.com";
0赞 ejucovy 6/3/2013
@Brent -- 您的静态文件需要从 mymainsite.com 的子域加载才能正常工作(例如,s3.mymainsite.com 按 docs.aws.amazon.com/AmazonS3/latest/dev/ 配置......)
1赞 Jernej Jerin 3/7/2014
事实上,扩展base_site.html和添加是必要的。如果不添加它,则会出现有关 document.domain 未在一侧设置的错误。<script type="text/javascript">document.domain = 'foo.bar.com';</script>
12赞 Hacking Life 4/14/2012 #8

我在 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 更改为您想要的任何内容。

评论

4赞 semente 9/4/2012
谢谢,这是我唯一的解决方案。(django-storages + s3)
0赞 Cerin 6/11/2013
这是一个可行的解决方案,但很难在管理员范围内覆盖所有媒体类。
0赞 caesarsol 3/7/2014
这是更简单的解决方案 IMO,但我使用了 apache conf,并仅限于特定的 tinyMCE 目录(在我的情况下Alias/static/js/libs/tiny_mce/)
0赞 awwester 4/4/2016
呃,我非常讨厌做这个答案。不幸的是,它是唯一有效的方法。投票。
5赞 Adam Spence 2/10/2013 #9

我发现最好的解决方案是通过设置从项目根目录或媒体目录提供tiny_mce媒体:

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

评论

0赞 Vladimir Nani 3/30/2013
您也可以指定TINYMCE_JS_ROOT
0赞 bharling 4/25/2014
这对我来说效果很好,我的大部分静态文件都通过 django 存储在 S3 上,并且我已经将 tinymce 文件设置为通过 apache 托管在为我的 django 应用程序提供服务的同一站点上。
1赞 Eduardo 8/15/2015 #10

我输入了你的答案,因为我遇到了同样的问题。第一个答案帮助我理解了问题,但不能解决问题。

所以。。。您已将代码上传到 Heroku,从那里尝试打开使用 TinyMCE 弹出窗口的.js,但静态文件(因此弹出窗口使用的 .js)已上传到另一台主机(在我的例子中是 S3)。

所以我稍微调查了一下,找到了这个解决方案: https://devcenter.heroku.com/articles/django-assets 顺便说一句,它就像一个魅力,我的项目已经工作了!

因此,基本上,您所做的就是将静态文件和代码上传到同一位置,这样您就不会违反同源策略。