2016-06-29 2 views
0

Джанго 1.9.7Не можете справиться с изображениями загруженными пользователем в процессе разработки

Не могли бы вы помочь мне справиться с пользователем загруженные изображения. Мне удалось сохранить изображения.

Но я не могу показать их. Пока это все о развитие этап (не производство).

Пример самого нижнего кода показывает html, когда я запускаю «Просмотр источника страницы» в Chrome. Этот «src =»/home/michael/workspace/... »является абсолютным путем.Он будет работать, если я создам такой html и открою его в браузере без веб-сервера.

Но сыворотка Я запускаю сервер Django dev , изображение не показывает.

не могли бы вы дать мне пинка здесь.

/pharchive/pharchive/settings.py

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

/pharchive/pharchive/urls.py

from django.conf.urls.static import static 
if settings.DEBUG: 
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

/pharchive/masterdocument/models.py

class Image(AbstractDocument): 
    image = models.ImageField(upload_to='images/%Y/%m/%d') 

/pharchive/masterdocument/views.py

class ImageDetailView(DetailView): 
    model = Image 

/pharchive/masterdocument/шаблоны/masterdocument /image_detail.html

<html> 
    <img src="{{ object.image.url }}"/> 
</html> 

вид-источник: http://localhost:8000/images/6/

<html> 
    <img src="/home/michael/workspace/pharchive/media/images/2016/06/29/Screenshot_from_2016-02-23_205205.png"/>  
</html> 
+0

Если вы обеспокоены развитием, как вы сказали, то добавление 'file: //' перед URL-адресом заставит его «работать» некоторое время. – Brian

+0

ну, я сейчас на стадии разработки. Что вы говорите, это hardcoding. В будущем он не будет развиваться. – Michael

+0

Это именно то, что я имел в виду под «работой» да. Не буду рекомендовать его в течение следующих 10 минут. – Brian

ответ

0

MEDIA_URL должен быть корневым URL для загруженных сред, например:

MEDIA_URL = '/media/' 

Вы поставили его на путь где скопированы загруженные носители.

Редактировать: запросить дополнительную информацию о том, как это работает.

Что вы пытаетесь сделать, это сохранить файл изображения, предоставленный пользователем, а затем передать его другим пользователям.Чтобы сохранить файл, необходимо указать местоположение в файловой системе, где хранить его, в вашем случае:

/home/michael/workspace/pharchive/media/images/2016/06/29/Screenshot_from_2016-02-23_205205.png

Джанго строит этот путь путем конкатенации этих частей:

  • MEDIA_ROOT
  • в ImageField «s интерполированное upload_to атрибут, здесь 'images/%Y/%m/%d' интерполированное к images/2016/06/29
  • ЗИИ e имя, здесь Screenshot_from_2016-02-23_205205.png.

Джанго также хранит в базе данных путь к файлу, по отношению к MEDIA_ROOT, в вашем случае images/2016/06/29/Screenshot_from_2016-02-23_205205.png

Теперь, чтобы служить сохраненный файл для пользователей, то первый должен быть доступен через URL-адрес, этот URL-адрес создается путем объединения параметра MEDIA_URL в путь, хранящийся в базе данных (возможно, измененный, чтобы сделать его совместимым с URL-адресом), здесь он дает /media/images/2016/06/29/Screenshot_from_2016-02-23_205205.png.

Последний шаг состоит в том, чтобы фактически обслуживать файл при доступе к ранее созданному URL-адресу, как правило, это не будет сделано так же в разработке и в производстве.

В разработке Django devserver будет использоваться для обслуживания файла, поэтому вы добавляете шаблон url, когда DEBUG является истинным. Этот шаблон URL отобразит любой URL-адрес, начинающийся с MEDIA_URL (/media/), чтобы просмотреть сохраненный файл и вернуть его содержимое.

В производстве вы будете использовать выделенный веб-сервер для загрузки загруженных файлов по соображениям производительности.

+0

Работа. Я приму этот ответ. Но вы могли бы просто провести еще пару минут и помочь мне понять, что здесь происходит. Я думал, что MEDIA_URL вообще не используется в этом случае. Итак, я просто пишу что-то в нем случайным образом. И теперь кажется, что этот путь к продуктивным медиафайлам влияет на показ изображений в dev-stage. Это для меня загадка. – Michael

+0

«MEDIA_URL» используется, потому что вы запрашиваете мультимедийные файлы, которые были загружены пользователем. Это то же самое, когда ваш сервер-разработчик запрашивает статические файлы, он будет использовать 'STATIC_URL' для запроса. При развертывании на производство или при наличии промежуточного сервера для тестирования вам необходимо сообщить веб-серверу (например, NGINX или Apache), где находятся статические и мультимедийные файлы. –

Смежные вопросы