Подтвердить что ты не робот

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

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

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

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

...

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

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

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

4b9b3361

Ответ 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"