2015-09-08 3 views
1

Прежде чем я объясню, у меня возник вопрос. Я делаю блог, и сообщения имеют изображение заголовка. Я загружаю это изображение, используя admin, когда создаю сообщение для своего блога. Является ли этот образ «статическим» или «медиа»?Как отображать изображения с ImageField в Django?

В любом случае, у меня есть мой проект, созданный следующим образом: mysite - мой проект, блог - мое приложение. У меня есть папка с именем static внутри блога. Внутри этой статической папки находятся еще четыре папки - css, images, fonts, js.

В settings.py, я это установить:

STATIC_URL = '/static/' 
STATIC_ROOT = os.path.join(BASE_DIR, 'static') 

Мой models.py выглядит следующим образом:

class Post(models.Model): 
    ... 
    header_image = models.ImageField('article_header_image', upload_to = 'blog/static/images/articleimages') 

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

Я делаю это следующим образом:

{% for post in posts %} 
<img src="{{post.header_image.url}}"> 
{% endfor %} 

Другое дело, как я могу использовать upload_to аргумент для загрузки изображений в статической папке приложения без явного указания его? Я думаю, в этом проблема. Если я использую upload_to = 'static/images/articleimages', в папке mysite, содержащей manage.py, создается новая статическая папка.

Любая помощь очень ценится!

+0

Почему вы не импортируете 'STATIC_ROOT' в' models.py' и используете его для создания пути загрузки? –

+0

@RohitJain: Мне жаль, что я так глуп, но вы можете подробно рассказать о том, как это сделать? –

+0

Вы можете сделать: 'from django.conf import STATIC_ROOT', а затем использовать его там. И хорошо быть глупым :) –

ответ

0

Вы можете импортировать файл настроек STATIC_ROOT из файла настроек и использовать это для biuld пути. В дополнении к этому, вы можете использовать вызываемый, и построить путь там вместо:

import os.path 
from django.conf import settings 

def generate_upload_path(instance, filename): 
    return os.path.join(settings.STATIC_ROOT, 'images/articleimages/') 

class Post(models.Model): 
    ... 
    header_image = models.ImageField('article_header_image', upload_to = generate_upload_path) 

Хорошо, если вы хотите, чтобы загрузить изображения в static директорию вашего приложения, вы можете использовать __path__ атрибут вашего приложения:

import blog 

def generate_upload_path(instance, filename): 
    return os.path.join(blog.__path__, 'static/images/articleimages/') 
+0

Это все еще создает статическую папку в папке mysite, содержащей manage.py. Я хочу, чтобы изображение загружалось в статическую папку внутри папки блога без явного указания его в аргументе upload_to. Спасибо, в любом случае. –

+0

@NoviceCoder Проверьте обновленный ответ. –

+0

Завтра буду проверять. Проблема в том, что сервер выполняет поиск блога/{blog/static/images/articleimages/latest-article-img-1.jpg}. Обратите внимание, что часть в скобке - это тот же путь в upload_to. Поэтому, если моя загрузка была upload_to = 'static/images/articleimages', и она загружала изображения в статическую папку внутри блога, тогда проблема была бы решена. Надеюсь, ваш новый метод работает. Благодарю. Еще один вопрос: это медиа-носитель или статический? –

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