Как включить файлы изображений в шаблоны Django? - PullRequest
60 голосов
/ 23 мая 2009

Я новичок в Django, и я пытаюсь научиться этому через простой проект, который я разрабатываю, который называется dubliners, и приложение под названием book. Структура каталогов выглядит следующим образом:

dubliners/book/  [includes models.py, views.py, etc.]
dubliners/templates/book/

У меня есть файл JPG, который должен отображаться в заголовке каждой веб-страницы. Где я должен хранить файл? Какой путь я должен использовать для тега, чтобы отобразить его с помощью шаблона? Я пробовал разные локации и пути, но пока ничего не работает.

...

Спасибо за ответ, размещенный ниже. Однако я пробовал относительные и абсолютные пути к изображению, и на веб-странице все еще отображается значок разорванного изображения. Например, если у меня есть изображение в моем домашнем каталоге и я использую этот тег в моем шаблоне:

<img src="/home/tony/london.jpg" /> 

Изображение не отображается. Однако если я сохраню веб-страницу в виде статического HTML-файла, изображения отобразятся, поэтому путь будет правильным. Может быть, веб-сервер по умолчанию, поставляемый с Django, будет отображать изображения, только если они находятся по определенному пути?

Ответы [ 11 ]

66 голосов
/ 06 августа 2009

Попробуйте это,

settings.py

# typically, os.path.join(os.path.dirname(__file__), 'media')
MEDIA_ROOT = '<your_path>/media'
MEDIA_URL = '/media/'

urls.py

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

.html

<img src="{{ MEDIA_URL }}<sub-dir-under-media-if-any>/<image-name.ext>" />

Протест

Осторожно! использование Context() даст вам пустое значение для {{MEDIA_URL}}. Вместо этого вы должны использовать RequestContext().

Надеюсь, это поможет.

33 голосов
/ 23 мая 2009

В производственном процессе вы просто сгенерируете HTML-код из вашего шаблона, указывающий, где хранятся медиа-файлы на хосте. Таким образом, ваш шаблон будет иметь, например,

<img src="../media/foo.png">

И тогда вы просто убедитесь, что там есть каталог с соответствующими файлами.

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

Право здесь .

17 голосов
/ 10 сентября 2012

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

В этом случае я не вижу противоречий для хранения такого контента в STATIC.
И все становится действительно просто:

статические

Для ссылки на статические файлы, которые сохранены в STATIC_ROOT Django поставляется со статическим тегом шаблона. Вы можете использовать это независимо от того, если вы используете RequestContext или нет.

{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />

скопировано с Официальная документация django 1.4 / Встроенные теги и фильтры шаблонов

11 голосов
/ 26 ноября 2010

Я потратил два целых дня, работая над этим, поэтому я просто решил поделиться своим решением. По состоянию на 26/11/10 текущая ветвь имеет 1.2.X, так что вам необходимо иметь следующее settings.py :

MEDIA_ROOT = "<path_to_files>" (i.e. /home/project/django/app/templates/static)
MEDIA_URL = "http://localhost:8000/static/"

* (помните, что MEDIA_ROOT - это место, где находятся файлы, а MEDIA_URL - это константа, которую вы используете в своих шаблонах.) *

Тогда в вас url.py поместите следующее:

import settings

# stuff

(r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),

Тогда в своем html вы можете использовать:

<img src="{{ MEDIA_URL }}foo.jpg">

Как работает django (насколько я понимаю:

  1. В html-файле он заменяет MEDIA_URL на путь MEDIA_URL, найденный в setting.py
  2. Он ищет в url.py любые совпадения для MEDIA_URL, а затем, если найдет совпадение (например, r '^ static / (? P. ) $' *, относится к http://localhost:8000/static/) ищет файл в MEDIA_ROOT, а затем загружает его
9 голосов
/ 23 мая 2015

/ media каталог в корневом каталоге проекта

Settings.py

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

urls.py

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

шаблон

<img src="{{MEDIA_URL}}/image.png" > 
8 голосов
/ 14 марта 2017

В разработке
В папке вашего приложения создайте имя папки «static» и сохраните изображение в этой папке.
Для использования изображения используйте:

<html>
    <head>
       {% load staticfiles %} <!-- Prepare django to load static files -->
    </head>
    <body>
        <img src={% static "image.jpg" %}>
    </body>
</html>

В производстве:
Все то же самое, что и в разработке, просто добавьте еще пару параметров для Django:

  1. добавить settings.py
    STATIC_ROOT = os.path.join(BASE_DIR, "static/") (это подготовит папку, в которой будут храниться статические файлы из всех приложений)

  2. убедитесь, что ваше приложение в INSTALLED_APPS = ['myapp',]

  3. в команде terminall run python manage.py collectstatic (это приведет к копированию статических файлов из всех приложений, включенных в INSTALLED_APPS, в глобальную статическую папку - папка STATIC_ROOT)

    Вот и все, что нужно Django, после этого вам нужно выполнить некоторые настройки на стороне веб-сервера, чтобы сделать настройки для использования статической папки. Например. в apache2 в файле конфигурации httpd.conf (для windows) или sites-enabled / 000-default.conf. (в разделе виртуального хоста сайта для linux) добавьте:

    Псевдоним \ static "path_to_your_project \ static"

    Требовать все предоставленные

    И это все

6 голосов
/ 08 сентября 2014

Если ваш файл является полем модели в модели, вы также можете использовать «.url» в теге шаблона для получения изображения.

Например.

Если это ваша модель:

class Foo(models.Model):
    foo = models.TextField()
    bar = models.FileField(upload_to="foo-pictures", blank = True)  

Передайте модель в контексте ваших представлений.

return render (request, "whatever.html", {'foo':Foo.objects.get(pk = 1)})

В вашем шаблоне вы можете иметь:

<img src = "{{foo.bar.url}}">
5 голосов
/ 23 мая 2009

Ваш

<img src="/home/tony/london.jpg" />

будет работать для файла HTML, считываемого с диска, так как предполагается, что URL равен file:///home/.... Для файла, обслуживаемого веб-сервером, URL-адрес будет выглядеть примерно так: http://www.yourdomain.com/home/tony/london.jpg, что может быть недопустимым URL-адресом, а не тем, что вы на самом деле имеете в виду.

Чтобы узнать, как обслуживать и где размещать статические файлы, ознакомьтесь с этим документом . В основном, если вы используете сервер разработки django, вы хотите показать ему место, где находятся ваши медиа-файлы, а затем заставить urls.py обслуживать эти файлы (например, с помощью некоторого префикса /static/ url).

Потребует от вас вставить что-то подобное в ваш urls.py:

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root': '/path/to/media'}),

В производственной среде вы хотите пропустить это и заставить ваш http-сервер ( apache , lighttpd и т. Д.) Обслуживать статические файлы.

3 голосов
/ 22 июня 2012

Еще один способ сделать это:

MEDIA_ROOT = '/home/USER/Projects/REPO/src/PROJECT/APP/static/media/'
MEDIA_URL = '/static/media/'

Для этого потребуется переместить папку мультимедиа в подкаталог статической папки.

Тогда в вашем шаблоне вы можете использовать:

<img class="scale-with-grid" src="{{object.photo.url}}"/>
2 голосов
/ 11 июня 2013

Я пробовал разные методы, но они не работали. Но это сработало. Надеюсь, это сработает и у вас. Файл / каталог должен находиться в следующих местах:

PROJEC / your_app / шаблоны проект / your_app / статический

settings.py

import os    
PROJECT_DIR = os.path.realpath(os.path.dirname(_____file_____))
STATIC_ROOT = '/your_path/static/'

пример:

STATIC_ROOT = '/home/project_name/your_app/static/'    
STATIC_URL = '/static/'    
STATICFILES_DIRS =(     
PROJECT_DIR+'/static',    
##//don.t forget comma    
)
TEMPLATE_DIRS = (    
 PROJECT_DIR+'/templates/',    
)

проектируемый / приложение / шаблоны / filename.html

внутри тела

{% load staticfiles %}

//for image

img src="{% static "fb.png" %}" alt="image here"

//note that fb.png is at /home/project/app/static/fb.png

Если fb.png был внутри /home/project/app/static/image/fb.png, тогда

img src="{% static "images/fb.png" %}" alt="image here" 
...