Невозможно загрузить изображение в django с помощью поля файла

Я не могу загрузить изображение.

вот мой models.py

class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200)
    text = models.TextField()
    image = models.FileField(upload_to = 'post/static/images/' , null= True, blank= True)
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

изображение не загружается в 'post/static/images/'

вот шаблон для загрузки изображения

    {% if post.media %}
    <img src="{{ post.image.url }}" class="img-responsive" />
    {% endif %}

person Sanjana    schedule 16.05.2017    source источник
comment
Вы включаете правильный enctype в свою форму? enctype="multipart/form-data"   -  person fez    schedule 16.05.2017
comment
Ваш код в шаблоне предназначен не для загрузки изображения, а для его отображения.   -  person doru    schedule 16.05.2017
comment
@doru мне нужно только отобразить изображение. но изображение не загружается в указанную папку   -  person Sanjana    schedule 16.05.2017
comment
@Kreloch Я не использую никаких форм. Это проблема?   -  person Sanjana    schedule 16.05.2017
comment
Если вы используете Linux, вам также следует проверить права доступа к папке загрузки.   -  person doru    schedule 16.05.2017


Ответы (2)


В вашем коде много проблем:

  1. В вашей модели - используйте поле для загрузки изображения ImageField (для использования ImageField у вас должна быть установлена ​​Pillow):

    image = models.ImageField(upload_to = 'images/' , null= True, blank= True)
    

    (вы будете загружать изображения в подпапку папки MEDIA_ROOT с именем images)

  2. Также поместите изображения в папку media — вы должны создать ее, в папке settings.py добавьте:

    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
    
  3. Чтобы позволить django обслуживать ваши медиафайлы (только для разработки!), вы должны добавить в свой основной (из каталога проекта, а не из папки приложения) файл urls.py:

    from django.conf import settings
    from django.conf.urls.static import static
    
    if settings.DEBUG:
        urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
  4. Пример простой формы для загрузки изображения:

    <form action="{% url upload_pic %}" method="post" enctype="multipart/form-data">{% csrf_token %}
        <input id="id_image" type="file" class="" name="image">
        <input type="submit" value="Submit" />
    </form>
    

    где url_upload_pic — это представление (функции), которое должно обрабатывать загрузку изображения.

person doru    schedule 16.05.2017

И я тоже думаю, что это хорошо.

MEDIA_ROOT и STATIC_ROOT должны иметь разные значения. До того, как STATIC_ROOT был введен, было обычным делом полагаться на MEDIA_ROOT или отступать от него, чтобы также обслуживать статические файлы; однако, поскольку это может иметь серьезные последствия для безопасности, для предотвращения этого существует проверка проверки.

https://docs.djangoproject.com/en/1.11/ref/settings/#media-root

Что вы хотите делать (в разработке), так это следовать этому руководству: https://docs.djangoproject.com/en/1.11/howto/static-files/#serving-files-uploaded-by-a-user-during-development

Во время разработки вы можете обслуживать загруженные пользователем медиафайлы из MEDIA_ROOT, используя представление django.views.static.serve().

Это не подходит для использования в производстве! Некоторые распространенные стратегии развертывания см. в разделе Развертывание статических файлов.

Например, если ваш MEDIA_URL определен как /media/, вы можете сделать это, добавив следующий фрагмент в свой urls.py:

По сути, вы загружаете файлы в место в MEDIA_ROOT, а затем говорите django обрабатывать их почти как статические. Но вы не загружаете напрямую в статический.

person e4c5    schedule 16.05.2017