Как загрузить изображения в django REST api?
Я создаю бэкенд с DRF для загрузки json-данных, которые я позже потребляю с помощью фронтенда REACT. К настоящему моменту все довольно стандартно и просто. В моей модели django есть поле ImageField, которое сериализуется как строка в виде "http://127.0.0.1:8000/media/example-randomcharacters.png".
(я определяю папку media в settings.py в django).
Как и ожидалось, в папке media появился новый файл с именем, указанным в API, но когда я пытаюсь получить изображение из url, возвращается следующее:
Разумеется, он не может быть использован react или любым другим внешним инструментом, поскольку url не предоставляет изображение. Что я делаю не так?
Вот код django:
models.py:
from django.db import models
class Project(models.Model):
"""Programming related project to show on my website. """
title = models.CharField(max_length=100)
description = models.TextField()
cover = models.ImageField()
link = models.URLField()
date_started = models.DateField(auto_now_add=True)
last_edited = models.DateField(auto_now=True)
def _str_(self):
return self.title
serializers.py:
from rest_framework import serializers
from .models import Project
class ProjectSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = '__all__'
В большинстве случаев я делаю так,
В
models.py
добавьте поле для изображения
image = models.ImageField(null=True, blank=True)
Настройте свой проект
settings.py
STATIC_URL = '/static/'
MEDIA_URL = '/images/'
STATICFILES_DIRS = [
BASE_DIR / 'static',
BASE_DIR / 'frontend/build/static' #Unnecessary if you just need Backend Setup for Image Upload. It's just to Load React Project Static Files
]
MEDIA_ROOT = BASE_DIR / 'static/images'
STATIC_ROOT = BASE_DIR / 'staticfiles'
Настроить
project.urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
#Your Project URL's....
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)#imp for what you want to achieve.
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Теперь, когда вы загружаете файл изображения из админки, он будет доступен по следующему шаблону URL
HTTP://localhost:8000/images/ImageFileName.png
Если вы хотите загрузить данные извне Django, вы можете следовать этому подходу...
@api_view(['POST'])
def uploadImage(request):
data = request.data
obj_id = data['obj_id']
obj= Project.objects.get(id=obj_id)
obj.image = request.FILES.get('image')
obj.save()
return Response('Image was uploaded')
Ассоциированный URL
path('upload/', views.uploadImage, name="image-upload"),
Примечание: Выделите в комментарии вашу озабоченность по поводу этого решения. Я буду рад выслушать вас. Спасибо!