как правильно указать статическое изображение в django

У меня есть шаблон, который отображает изображение:

{% load staticfiles %}

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

Ссылка на изображение не работает, но указывает на:

localhost/static/img/logo.png

Какие значения мне нужно установить для static_root, static_url и STATICFILES_DIRS, чтобы это изображение отображалось правильно?

Это моя структура каталогов:

имя_проекта (верхний уровень)

--- имя_проекта

--- --- имя_проекта

--- --- --- настройки

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

--- --- статический

--- --- --- изображение

Это моя статическая конфигурация в настройках:

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',
)

Вот что он показывает: введите здесь описание изображения

Я уже сделал collectstatic, и это не работает.


person Atma    schedule 27.03.2014    source источник
comment
Какова среда вашего веб-сервера? Вы используете manage.py runserver или у вас есть подходящий веб-сервер? Django обычно вообще не обслуживает статические файлы, и вам нужно настроить свой веб-сервер для их обслуживания напрямую, за исключением случаев, когда вы запускаете manage.py runserver, который действительно обслуживает статические файлы (поскольку у вас нет веб-сервера в этом случае взять на себя эту ответственность)   -  person lanzz    schedule 28.03.2014
comment
я запускаю manage.py на своей локальной машине. В соответствии с этим при запуске dev будут обслуживаться файлы: docs.djangoproject.com/ ru/1.6/howto/static-files   -  person Atma    schedule 28.03.2014
comment
Вам нужно будет опубликовать структуру каталогов вашего приложения в дополнение к вашим настройкам для STATIC_URL и STATICFILES_DIRS, чтобы диагностировать проблему.   -  person Brandon    schedule 28.03.2014
comment
@Brandon Я добавил структуру каталогов и конфигурацию настроек.   -  person Atma    schedule 01.04.2014


Ответы (3)


Статические файлы могут сбивать с толку в Django. Постараюсь объяснить как можно проще...

STATIC_ROOT Это каталог, из которого вы должны обслуживать статические файлы в рабочей среде.

STATICFILES_DIRS Это каталог, из которого вы должны обслуживать статические файлы в разработке.

STATIC_ROOT и STATICFILES_DIRS не могут указывать на один и тот же каталог.

Django — это модульный фреймворк. Некоторые модули приложения содержат собственные шаблоны, css, изображения и JavaScript. Django admin — одно из таких приложений. Django расширяет эту модульность для приложений, которые вы создаете, используя разные каталоги для статических файлов при разработке и производстве.

Когда DEBUG = True и вы включили django.core.staticfiles в свой INSTALLED_APPS, Django будет обслуживать файлы, расположенные в кортеже STATICFILES_DIRS, используя путь STATIC_URL в качестве отправной точки.

В производстве эта ответственность должна быть возложена на Nginx, Apache, CloudFront и т. д. Когда DEBUG = False, Django не будет автоматически обслуживать статические файлы.

Когда вы бежите:

$ python manage.py collectstatic

Файлы, указанные в STATICFILES_DIRS, копируются в STATIC_ROOT для развертывания.

Итак, чтобы ответить на ваш вопрос, я бы сделал следующее:

Создайте еще один каталог для хранения ваших статических файлов в процессе разработки и добавьте этот путь в свой STATICFILES_DIRS. Я обычно называю эту папку «static-assets». Он может находиться на том же уровне, что и ваш существующий «статический» каталог.

Установите STATIC_ROOT на путь к вашему существующему «статическому» каталогу.

Если вы внимательно посмотрите на путь, который возвращает 404 на вашем снимке экрана, путь к изображению указан как: /static/img/logo.png, но ваш каталог для изображений: /static/image/

Поэтому дважды проверьте путь к изображению, чтобы убедиться, что вы указываете на правильный каталог.

person Brandon    schedule 01.04.2014
comment
спасибо, пожалуйста, добавьте больше информации, потому что это одна из очень сложных тем в django. - person giveJob; 25.02.2019
comment
Пожалуйста. В Django много настроек, и статические файлы не раз меня сбивали с толку. - person Brandon; 25.02.2019
comment
Спасибо за этот комментарий. Удивительно сложно найти такое ясное объяснение в документации. - person David Maness; 16.03.2019
comment
Большое спасибо, Брэндон. Я никогда не мог этого понять. - person TheGuardener; 14.03.2020

Создайте папку "staticfiles" в корне вашего проекта, где существует файл settings.py.

В статических файлах вы можете пойти по этому пути.

  • css
  • js
  • картинки

В настройках.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>
person 4dgaurav    schedule 04.04.2014
comment
это поможет, даже если вы планируете развернуть свое приложение на героку, движке приложения или aws.. - person 4dgaurav; 04.04.2014

Если вы находитесь в режиме разработки, определите только одну строку:

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

Вам не нужно определять STATIC_ROOT = '/Users/myuser/myprojectname/myprojectname'

ИЛИ

STATICFILES_DIRS как BASE_DIR

Итак, рабочее решение:

STATIC_URL = '/static/'

STATICFILES_DIRS = ( os.path.join('static'), )
person Praveen Yadav    schedule 16.03.2020