Невозможно загрузить изображение в 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 ответа
Есть много проблем с вашим кодом:
В вашей модели - используйте поле для добавления изображения
ImageField
(использоватьImageField
вам необходимо установить подушку):image = models.ImageField(upload_to = 'images/' , null= True, blank= True)
(вы загрузите изображения в подпапку папки MEDIA_ROOT с именем
images
)Также поместите изображения в медиа-папку - вы должны создать их, в папку settings.py добавить:
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
Чтобы 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)
Пример простой формы для загрузки изображения:
<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.