2016-01-02 3 views
1

У меня возникли проблемы с пониманием и использованием ImageField Django.Django ImageField upload_to path

У меня есть модель:

class BlogContent(models.Model): 
    title = models.CharField(max_length=300) 
    image = models.ImageField(upload_to='static/static_dirs/images/') 
    description = models.TextField() 

Моя файловая система в настоящее время:

src 
|---main_project 
|---app_that_contains_blog_content_model 
|---static 
     |---static_dirs 
       |---images 

При запуске сервера и перейти на страницу администратора, я могу добавить объекты BlogContent. После выбора изображения для поля изображения изображение имеет временное имя. Однако после сохранения этого объекта я не могу найти изображение в папке, указанной в пути upload_to.

Каков правильный способ сделать это?

ответ

7

Ваше изображение будет загружать в media папку, так Beter путь изменения в модели, как images/, и они будут загружать на media/images

В settings.py добавить

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

В url.py

from django.conf.urls.static import static 
from django.conf import settings 
urlpatterns = [.... 
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

А затем, если вы хотите, чтобы отобразить все изображения, использовать что-то вроде этого в view.py
BlogContent.objects.all()

И делают это так:

{% for img in your_object %} 
<img src="{{ img.image.url }}" > 
{% endfor %} 
1

Вы должны использовать медиа-путь, а не статический. См docs

+0

Спасибо! Догадаться. Изображения находятся в папке с носителями. – user3025403

3

static в upload_to оленья кожа имеет смысла, так как пользователь мог загруженные изображения перейти в папку media/ .. вам нужны эти:

image = models.ImageField(upload_to='blog/%Y/%m/%d') 

и все изображения земли в:

media/blog/2016/01/02/img_name.jpg 

вы получить доступ к нему в шаблоне так:

<img src="{{ blog.image.url }}"> 

в настройках:

import os 
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 

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