在Django管理员中,微小的MCE弹出窗口空白

时间:2009-02-21 02:58:03

标签: django django-admin tinymce

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

任何想法?

9 个答案:

答案 0 :(得分:19)

我也遇到了这个问题,使用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: Static Web Sites: Custom Domain or Subdomain),您需要在两个地方设置javascript中的document.domain:

1)在tiny_mce_popup.js

2)在tiny_mce.js之前的任何其他内容,或者,在tiny_mce.init()调用发生之前,在主页面中的脚本标记中呈现HTML。 (我发现破解tiny_mce.js并将其重新上传到S3更方便,而不是使用django-tinymce的小部件渲染。)

您需要在两个地方将document.domain设置为MAIN SITE的域:因此,对于foo.bar.com上的站点以及static.foo.bar.com上的静态媒体,您需要设置文档。 domain =“foo.bar.com”

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

答案 1 :(得分:12)

我在Heroku上运行我的django App并使用Rackspace CDN遇到了这个问题。我的静态文件设置都设置为使用rackspace CDN来共享文件

  • 解决方案是使用普通静态文件服务于特定的tinymce文件:

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

在我的网址中:

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

static.serve函数允许您提供标准静态设置之外的静态文件。您可以将url conf中的static更改为您想要的任何内容。

答案 2 :(得分:6)

如果这是TinyMCE的JQuery版本,并且您正在从另一台服务器向运行Django的服务器提供媒体(包括TinyMCE .js文件),这可能适用:您的浏览器将阻止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给出visual feedback - 也许有类似的Python实现基于PyTextilePython-Textile ??),或markItUp!(JQuery,因此可能会出现同样的问题),它有一个很好的可视化编辑工具栏。

如果你怀疑这个move away from 'Word-like' editors,&lt; - 这个链接是关于这个问题的好文章。

后记:在WMD中有一个很好的Javascript实现Markdown,它提供了类似TinyMCE的工具栏,语义标记式(wysiwym - '你所看到的就是你的意思 ')编辑器快捷方式。 GitHub uses a related solution

答案 3 :(得分:5)

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

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

我遇到了空白弹出问题。在我的情况下,问题是将它们放在另一个子域中。 不确定是你的情况。

我通过编辑解决了 tiny_mce_popup.js 并添加

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

当然用您的子域名替换static以拥有“domain.com”字符串

然后在将.tinymce(...)附加到元素之前再次定义document.domain。根据您所处的位置,您可以使用服务器端脚本或上面的相同代码。从这里的网站http://tinymce.moxiecode.com/wiki.php/How-to_load_TinyMCE_crossdomain

查看维基

答案 6 :(得分:1)

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

可能与处于不同的域名有关吗?

答案 7 :(得分:1)

出现同样的问题,我使用的是所有js / css等的Amazon S3,所以相对网址不是一个选项。

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

document.domain = 'moxie.org';

希望这会有所帮助......

答案 8 :(得分:0)

您必须在配置文件中更改tiny_mce_popups.js中的document.domain。 这里描述了这些程序:

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

希望得到这个帮助。

相关问题