Как загрузить изображения в 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"),

Примечание: Выделите в комментарии вашу озабоченность по поводу этого решения. Я буду рад выслушать вас. Спасибо!

Вернуться на верх