Как включить файлы изображений в шаблоны Django?
Я новичок в Django, и я пытаюсь изучить его через простой проект, который я разрабатываю под названием "dubliners" и приложение под названием "book". Структура каталогов выглядит так:
dubliners/book/ [includes models.py, views.py, etc.]
dubliners/templates/book/
У меня есть JPG файл, который должен отображаться в заголовке каждой веб-страницы. Где я должен хранить файл? Какой путь я должен использовать для тега, чтобы отобразить его с помощью шаблона? Я пробовал разные места и пути, но пока ничего не работает.
...
Спасибо за ответ, указанный ниже. Тем не менее, я пробовал как относительные, так и абсолютные пути к изображению, и я все еще получаю значок с разбитым изображением, отображаемый на веб-странице. Например, если у меня есть изображение в моем домашнем каталоге и используйте этот тег в моем шаблоне:
<img src="/home/tony/london.jpg" />
Изображение не отображается. Однако, если я сохраняю веб-страницу как статический файл HTML, изображения отображаются, поэтому путь правильный. Может быть, веб-сервер по умолчанию, который поставляется с Django, будет отображать изображения только в том случае, если они находятся на определенном пути?
Ответы
Ответ 1
В процессе производства вам просто будет создан HTML-код из вашего шаблона, указывающий на то, где бы на хосте хранятся медиа файлы. Таким образом, ваш шаблон будет иметь, например,
<img src="../media/foo.png">
И тогда вы просто убедитесь, что каталог существует с соответствующими файлами.
во время разработки - другая проблема. Документы django объясняют это кратко и достаточно ясно, что более эффективно связывать их и вводить здесь, но в основном вы определяете представление для сайта с жестким кодом пути к местоположению на диске.
Вправо здесь.
Ответ 2
Попробуйте это,
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>" />
Caveat
Осторожно! используя Context()
, вы получите пустое значение для {{MEDIA_URL}}
. Вместо этого вы должны использовать RequestContext()
.
Надеюсь, это поможет.
Ответ 3
Я понимаю, что ваш вопрос касался файлов, хранящихся в MEDIA_ROOT, но иногда можно хранить содержимое в статике, когда вы больше не планируете создавать контент этого типа.
Может быть, это редкий случай, но в любом случае - если у вас есть огромное количество "картинок дня" для вашего сайта - и все эти файлы находятся на вашем жестком диске?
В этом случае я не вижу противоречия для хранения такого контента в STATIC.
И все становится очень простым:
статические
Ссылка на статические файлы, сохраненные в STATIC_ROOT Django поставляется со статическим тегом шаблона. Вы можете использовать это независимо от того, если вы используете RequestContext или нет.
{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
скопирован из Официальная документация django 1.4/Встроенные теги и фильтры шаблонов
Ответ 4
Я провел два твердых дня, работая над этим, поэтому я просто решил поделиться своим решением. По состоянию на 26/11/10 текущая ветвь равна 1.2.X, поэтому вы должны будете иметь в своем распоряжении следующие параметры .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 (насколько я могу понять:
- В html файле он заменяет MEDIA_URL на путь MEDIA_URL, найденный в файле settings.py
- Он ищет в url.py для поиска совпадений для MEDIA_URL, а затем, если находит совпадение (например, r '^ static/(? P.) $' * относится к http://localhost: 8000/static/) он ищет файл в MEDIA_ROOT и затем загружает его.
Ответ 5
/медиакаталог в корне проекта
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" >
Ответ 6
Если ваш файл является полем модели внутри модели, вы можете также использовать ".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}}">
Ответ 7
Ваш
<img src="/home/tony/london.jpg" />
будет работать для HTML файла, считанного с диска, так как он будет считать URL file:///home/...
. Для файла, обслуживаемого с веб-сервера, URL-адрес будет выглядеть примерно так: http://www.yourdomain.com/home/tony/london.jpg
, который может быть недопустимым URL, а не тем, что вы на самом деле имеете в виду.
О том, как обслуживать и куда разместить ваши статические файлы, ознакомьтесь с этим . В основном, если вы используете сервер разработки django, вы хотите показать ему место, где находятся ваши медиафайлы, а затем запустите urls.py
эти файлы (например, с помощью некоторого префикса URL /static/
).
Попросит вас добавить что-то вроде этого в urls.py
:
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': '/path/to/media'}),
В рабочей среде вы хотите пропустить это и сделать ваш HTTP-сервер (apache, lighttpd и т.д.) обслуживать статические файлы.
Ответ 8
В разработке
В папке приложения создайте имя папки "static" и сохраните изображение в этой папке.
Использование изображения:
<html>
<head>
{% load staticfiles %} <!-- Prepare django to load static files -->
</head>
<body>
<img src={% static "image.jpg" %}>
</body>
</html>
В производстве:
Все так же, как в разработке, просто добавьте еще пару параметров для Django:
-
добавить settings.py
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
(это подготовит папку, в которой будут храниться статические файлы из всех приложений)
-
убедитесь, что ваше приложение находится в INSTALLED_APPS = ['myapp',]
-
в команде terminall run python manage.py collectstatic (это сделает копию статических файлов из всех приложений, включенных в INSTALLED_APPS, в глобальную статическую папку - папку STATIC_ROOT)
Thats все, что нужно Django, после этого вам нужно сделать некоторые настройки веб-сервера, чтобы делать предпосылки для использования статической папки. Например. в apache2 в файле конфигурации httpd.conf (для Windows) или с сайтами /000-default.conf. (под частью виртуального хоста сайта для Linux) добавьте:
Alias \ static "path_to_your_project\static"
Требовать все предоставленные
И что все
Ответ 9
Другой способ сделать это:
MEDIA_ROOT = '/home/USER/Projects/REPO/src/PROJECT/APP/static/media/'
MEDIA_URL = '/static/media/'
Это потребует, чтобы вы переместили папку мультимедиа в подкаталог статической папки.
Затем в шаблоне вы можете использовать:
<img class="scale-with-grid" src="{{object.photo.url}}"/>
Ответ 10
Я пробовал различный метод, он не работал. Но это сработало. Надеюсь, что это сработает и для вас. Каталог файлов/файлов должен находиться в следующих местах:
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"