Невозможно загрузить изображение в Django, используя filefield

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

вот мой 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 %}

2 ответа

Решение

Есть много проблем с вашим кодом:

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

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

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

  2. Также поместите изображения в медиа-папку - вы должны создать их, в папку 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 это (функция) представление, которое должно обрабатывать загрузку изображения.

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

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

https://docs.djangoproject.com/en/1.11/ref/settings/

То, что вы хотите сделать (в разработке), это следовать этому руководству: https://docs.djangoproject.com/en/1.11/howto/static-files/

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

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

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

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

Другие вопросы по тегам