Как включить файлы изображений в шаблоны Django?



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



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


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



...



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



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


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

1756   11  

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 (насколько я могу понять, это:

  1. в html-файле он заменяет MEDIA_URL на путь MEDIA_URL, найденный в setting.py
  2. он выглядит внутри 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:

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

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

  3. в терминале выполнить команду 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

    Ничего не найдено.