如何正确指向django中的静态图像

时间:2014-03-27 21:59:00

标签: django django-templates django-staticfiles django-settings

我有一个渲染图像的模板:

{% load staticfiles %}

<img src="{% static "img/logo.png" %}" alt="My image"/>

图片链接已损坏,但它指向:

localhost/static/img/logo.png

我需要为static_root,static_url和STATICFILES_DIRS设置哪些值才能使此图像正确显示?

这是我的目录结构:

myprojectname(顶级)

--- myprojectname

--- --- myproectname

--- --- ---设置

--- --- --- --- base.py(setting.py)

--- ---静态

--- --- --- img

这是我在设置中的静态配置:

STATIC_ROOT = '/Users/myuser/myprojectname/myprojectname'
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    #normpath(join(SITE_ROOT, 'static')),
    os.path.join(BASE_DIR, "static"),
    '/Users/myuser/myprojectname/myprojectname/static',
)

这是它所显示的: enter image description here

我已经完成了一个收集站,这不起作用。

3 个答案:

答案 0 :(得分:18)

Django中的静态文件可能会造成混淆。我会尽可能简单地解释......

STATIC_ROOT 这是您应该在 生产 中提供静态文件的目录。

STATICFILES_DIRS 这是您应该在 开发 中提供静态文件的目录。

STATIC_ROOT和STATICFILES_DIRS无法指向同一目录。

Django是一个高度模块化的框架。一些应用程序模块包含自己的模板,css,图像和JavaScript。 Django管理员就是这样一个应用程序。 Django通过在开发与生产中使用静态文件的不同目录,将这种模块性扩展到您创建的应用程序。

DEBUG = Truedjango.core.staticfiles中包含INSTALLED_APPS时,Django将使用STATICFILES_DIRS路径作为STATIC_URL元组提供位于DEBUG = False元组中的文件起点。

在制作中,应该对Nginx,Apache,CloudFront等负责。当$ python manage.py collectstatic 时,Django不会自动提供任何静态文件。

当你跑步时:

{{1}}

将STATICFILES_DIRS中指定的文件复制到要部署的STATIC_ROOT中。

所以,为了回答你的问题,我会做以下事情:

创建另一个目录以将静态文件存储在开发中,并将该路径添加到STATICFILES_DIRS。我通常称这个文件夹为#34; static-assets&#34;。它可以与您现有的&#34;静态&#34;处于同一级别。 。目录

将STATIC_ROOT设置为现有&#34;静态&#34;的路径。 。目录

如果仔细查看屏幕截图中返回404的路径,则图像路径指定为:/static/img/logo.png,但图像目录为:/ static / image /

请仔细检查您的图片路径,确保您指向正确的目录。

答案 1 :(得分:4)

制作文件夹&#34; staticfiles&#34;在您的项目的根目录中,settings.py存在

在静态文件中你可以这样..

  • CSS
  • JS​​
  • 图像

在settings.py中

STATIC_ROOT = os.path.join(PROJECT_DIR,'static')
STATIC_URL = '/static/'

STATICFILES_DIRS = (
                os.path.join(PROJECT_DIR,'staticfiles'), # if your static files folder is named "staticfiles"
)
TEMPLATE_DIRS = (
                os.path.join(PROJECT_DIR,'template'), # if your static files folder is named "template"
)

在base.html中

<link rel="stylesheet" type="text/css" href="{% static 'css/demo.css' %}" /> 

<script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script>

在其中包含base.html

的其他模板文件中
{% extends "base.html" %}
{% load static %}


<script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script>


<div id="yourID" class="yourClass">
    <img src="{% static "images/something.gif" %}" alt="something" >
</div>

答案 2 :(得分:2)

如果您处于开发模式,则只需定义一行:

STATICFILES_DIRS = ( os.path.join('static'), )

您不需要定义STATIC_ROOT ='/ Users / myuser / myprojectname / myprojectname'

OR

STATICFILES_DIRS为BASE_DIR

因此,可行的解决方案是:

STATIC_URL = '/static/'

STATICFILES_DIRS = ( os.path.join('static'), )