Как включить файлы изображений в шаблоны Django?
Я новичок в Django, и я пытаюсь изучить его через простой проект, который я разрабатываю под названием "дублинцы" и приложение под названием "Книга". Структура каталогов выглядит так:
dubliners/book/ [includes models.py, views.py, etc.]
dubliners/templates/book/
у меня есть JPG-файл, который должен отображаться в заголовке каждой веб-страницы. Где я должен хранить файл? Какой путь я должен использовать тег, чтобы отобразить его с помощью шаблона? Я пробовал различные места и пути, но ничего не работает так далеко.
...
Спасибо за ответ, размещенные ниже. Тем не менее, я пробовал как относительные, так и абсолютные пути к изображению, и я все еще получаю значок сломанного изображения, отображаемый на веб-странице. Например, если у меня есть изображение в моем домашнем каталоге и использовать этот тег в моем шаблоне:
<img src="/home/tony/london.jpg" />
изображение не отображается. Если я сохраню веб-страницу как статический HTML-файл, однако, изображения отображаются, поэтому путь правильный. Возможно, веб-сервер по умолчанию, который поставляется с Django будет отображать изображения только в том случае, если они находятся на определенном пути?
11 ответов:
в производстве у вас будет только HTML, созданный из вашего шаблона, указывающий на то, где у хоста хранятся мультимедийные файлы. Так что ваш шаблон будет просто например
<img src="../media/foo.png">и тогда вы просто убедитесь, что каталог есть с соответствующими файлами.
во время разработки-это другой вопрос. Документы django объясняют это кратко и достаточно ясно, что более эффективно связать там и ввести его здесь, но в основном вы будете определять представление для носителя сайта с жестко заданным путем к местоположению на диске.
право здесь.
попробуйте это,
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(), вместо.надеюсь, это поможет.
Я понимаю, что ваш вопрос был о файлах, хранящихся в MEDIA_ROOT, но иногда можно хранить контент в статике, когда вы больше не планируете создавать контент этого типа.
Может быть это редкий случай, но в любом случае - если у вас есть огромное количество "картины дня" для вашего сайта - и все эти файлы на вашем жестком диске?в этом случае я не вижу контраста для хранения такого контента в статике.
И все становится по-настоящему просто:статический
для ссылки на статические файлы, сохраненные в STATIC_ROOT Django поставляется со статическим тегом шаблона. Вы можете использовать это независимо от того, если вы используете RequestContext или нет.
{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />скопировал из официальная документация django 1.4 / встроенные теги шаблонов и фильтры
Я провел два твердых дня, работая над этим, поэтому я просто подумал, что поделюсь своим решением. По состоянию на 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 (насколько я могу понять, это:
- в html-файле он заменяет MEDIA_URL на путь MEDIA_URL, найденный в setting.py
- он выглядит внутри url.py чтобы найти любые совпадения для MEDIA_URL, а затем, если он найдет совпадение (например,Р'^статический/(?П.)$'* относится к http://localhost:8000/static/) он ищет файл в MEDIA_ROOT, а затем загружает его
/каталог носителей в корневом каталоге проекта
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" >
Если ваш файл является полем модели в модели, вы также можете использовать ".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}}">
в разработке
В папке приложения создайте имя папки "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',]в терминале выполнить команду python manage.py collectstatic (это сделает копию статических файлов из всех приложений, включенных в INSTALLED_APPS в глобальную статическую папку-папку STATIC_ROOT )
вот и все, что нужно Django, после этого вам нужно сделать некоторые настройки на стороне веб-сервера, чтобы сделать предустановки для использования статической папки. Например, в apache2 в конфигурационном файле httpd.conf (для windows) или сайты-включено / 000-по умолчанию.конф. (в разделе часть виртуального хоста сайта для linux) добавить:Alias \static "path_to_your_project\static"
Требовать, чтобы все предоставленные
вот и все
код
<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 и т. д.) служить статические файлы.
другой способ сделать это:
MEDIA_ROOT = '/home/USER/Projects/REPO/src/PROJECT/APP/static/media/' MEDIA_URL = '/static/media/'для этого потребуется переместить папку мультимедиа в подкаталог статической папки.
тогда в вашем шаблоне вы можете использовать:
<img class="scale-with-grid" src="{{object.photo.url}}"/>
Я пробовал различные методы, ничего не получилось.Но это сработало.Надеюсь, что это будет работать и для вас. Файл / каталог должен находиться в следующих местах:
проект / your_app / шаблоны project/your_app / static
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/', )proj / app / 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"
Если вы дадите адрес онлайн-изображения в своем проекте django, он будет работать. это работает на меня. Тебе стоит попробовать.
Comments