【问题标题】:Django - admin_media_prefix access from javascriptDjango - 来自 javascript 的 admin_media_prefix 访问
【发布时间】:2012-01-28 11:54:14
【问题描述】:

在管理员中,我希望 admin 媒体 url 可以从任何 javascript 访问。
我已经将它包含在请求上下文中。
但是为了能够从包含的 javascript 中访问它,

<script type="text/javascript">
  window.__admin_media_prefix__ = "{{ ADMIN_MEDIA_URL }}";
</script>

我必须在基本模板中添加类似的内容还是有更简洁的方法?

【问题讨论】:

  • 我在模板中打印了我的媒体网址:console.log("{{MEDIA_URL}}") 它有效!那么这个管理媒体有什么问题呢?可能是它的上下文不正确?
  • 那是因为它是从模板引擎中检索出来的。但我说的是从单独的 js 文件中获取这个值。
  • 如果你把它放在一个单独的 js 文件中,你将无法使用模板变量 ADMIN_MEDIA_URL 动态设置它。我相信你这样做的方式是默认的 Django 方式。

标签: django django-admin django-templates django-staticfiles


【解决方案1】:

django 不会以任何方式解释媒体(静态)文件。在生产站点上,python 代码甚至可能无法访问该文件,因为它们可能由前端网络服务器提供服务。所以你有一个疯狂的选择:使用类似服务器端包含(SSI)的东西通过以某种方式解析配置文件将变量内容嵌入到选择的媒体文件中。

更好的想法是为每个站点使用相同的管理媒体前缀方案,为您选择的网络服务器提供灵活的每个站点配置文件,其中管理媒体文件将从某个已知位置提供:

location ^~ /media/ {
    root        /.../django-$django_ver/contrib/admin/;
}

【讨论】:

    【解决方案2】:

    我可以提供一个有点“邪恶”的解决方案:因为 Django 1.4 django.contrib.admin 使用 django.contrib.staticfiles 来处理所有静态的东西。由于 Admin 的 Javascript 使用 missing-admin-media-prefix 如果找不到,我们可以进行重定向,例如在阿帕奇:

    RewriteRule ^/missing-admin-media-prefix/(.*)$ /static/admin/$1 [L,R=301]
    

    (当然,如果您的STATIC_URL 设置为/static

    如果您经常在 Admin 中修改一些东西,并且不想让全局 Javascript 变量声明使您的模板变得混乱,那么这种方法特别好。

    【讨论】:

      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 2011-08-18
      • 2018-02-28
      • 2018-01-11
      • 2012-03-06
      • 1970-01-01
      相关资源
      最近更新 更多