2015-08-17 1 views
1

Мне нужно установить изображение профиля для модели в Django. Я использую подушку. Моя проблема в том, что путь, который я установил на models.py (где изображения идут, когда я загружаю их с помощью admin), не совпадает с тем, который используется шаблоном, и поэтому изображения никогда не отображаются.Невозможно правильно установить путь для изображения, связанного с моделью, в Django

Моя статическая папка находится в папке приложения (это простой проект с одним приложением), но администратор загружает изображения в какую-то папку за пределами папки приложения.

Это мой код в models.py:

def get_image_path(instance, filename): 
    return os.path.join('static/artists/images', str(instance.id), filename) 

class Artist(models.Model): 
    name = models.CharField(max_length=255) 
    soundcloud = models.URLField(max_length=255, blank=True, null=True) 
    description = models.TextField() 
    profile_picture = models.ImageField(upload_to=get_image_path, blank=True, null=True) 
    current_roster = models.BooleanField(default=True) 

    def __str__(self): 
     return self.name.encode('utf8') 

И это код в шаблоне:

{% if artist.profile_picture %} 
       <img src="{{ artist.profile_picture.url }}" alt="Artist pic" style="width: 200px;"> 
{% endif %} 

Может кто-нибудь помочь мне, пожалуйста? Заранее спасибо!

ответ

0

Прежде всего: Джанго предоставляет 2 отдельные наборы файлов: static и media и их обычаи отличаются:

  • статические файлы подаются с кодом проекта и связаны с этим кодом. Это могут быть, например, файлы CSS, JavaScript, изображения, которые являются частью вашего стиля или HTML-макета в целом.
  • Файлы мультимедиа загружаются в ваш проект по сценариям, администратору и т. Д. И связаны с данными в вашей базе данных. Это может быть фотография в вашей статье, аватар пользователя на вашем сайте и т. Д.

Обе группы файлов должны обслуживаться непосредственно вашим HTTP-сервером. Оба файла хранятся внутри глобальных папок для каждого проекта - в случае статических файлов: они собираются из всех используемых приложений, в случае медиа-файлов: они загружаются из Интернета. Ни один из них не должен обслуживаться из каталога приложений.

Во-вторых: вы не должны указывать статическую или медиа-папку в upload_to, она будет добавлена ​​django на основе ваших настроек.

+0

Спасибо! Я переместил статическую папку в папку проекта (вместо папки приложения) и все стили, и все пропало. Как вы это настроили? – Gothbag

+0

Где я сказал, что вы должны их переместить? Оставьте их в папке приложения. Создайте новый каталог внутри вашего проекта (лично я предпочитаю создавать dir с именем 'public' и внутри 2 dirs:' static' и 'media'), установить путь к этому каталогу внутри вашего файла настроек (как' STATIC_ROOT') и запустить './manage.py collectstatic'. Все статические файлы из всех приложений будут скопированы здесь. – GwynBleidD

0

Это должно сработать для вас, и вы работаете с файлами мультимедиа, которые не являются статичными, и я сделал все необходимые настройки ниже, статические файлы - css js и изображения, не загруженные самими пользователями. Но если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий.

settings.py - добавьте это к вашим context_processors, и убедитесь, что средства массовой информации и медиа-корневой URL настроены этот путь

TEMPLATES = [ 
     { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.core.context_processors.media', ###add this string here 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
     }, 
    ] 

    MEDIA_URL='/media/' 
    MEDIA_DIRS=[os.path.join(BASE_DIR, 'media')] 

models.py - медиа/СМИ/изображения/1/file.jpeg < --- путь, остальные ваши модели выглядят хорошо

def get_image_path(instance, filename): 
    return os.path.join('/media/images', str(instance.id), filename) 
    ###### added media to the path ####### 

template.html - сделать изменения, которые я сделал для вашей HTML путь должен отображаться в качестве средств массовой информации/СМИ/изображений/instance.id/profile_picture. jpeg, имя экземпляра и имя файла составлены, но вы получаете то, что я говорю.

{% if artist.profile_picture %} 
     <img src="{{ MEDIA_URL }}/{{ artist.profile_picture }}" alt="Artist pic" style="width: 200px;"> 
    {% else %} 
     <p> you can download a picture one day. </p> 
    {% endif %} 
+0

Спасибо! Кажется, это почти работает, поскольку источник изображения (src) находится в папке с медиа, но теперь администратор загружает изображение в папку с именем images (не внутри медиа-папки) в моей папке проекта. – Gothbag

+0

Простое исправление, если вы хотите, чтобы я отредактировал свой ответ очень быстро –

+0

Да, пожалуйста. Я был бы очень благодарен, если бы вы это сделали. Благодаря! – Gothbag

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