Allprod
Allprod

Reputation: 443

Django Rest app not using media root correctly to serve images

I have a project that has 3 apps, one named stores with store models, products with product models, and api which is the rest framework app that serves the Json results to clients. I set the media root in settings.py as MEDIA_ROOT = '/photos/' and the upload works for both product and store models. The main problem here is that for some reason the rest framework returns a url that references the api app instead of the products or stores apps for the media root url. here are my models

class Product(models.Model):

def get_image_path(instance, filename):
    return '/Products/' + filename

picture = models.ImageField(width_field=None, max_length=100, blank =True, null =True)

store:

class Store(models.Model):


def __str__(self):
    return self.name


def get_image_path(instance, filename):
    return os.path.join('productphotos', 'stores', filename)

picture = models.ImageField(width_field=None, max_length=100, blank =True, null =True)

How do i set the mediaroot to the project directory instead so that all apps in the project reference it as mediaroot instead of themselves?

The upload works and upoads the pictures to the instructed directories in the root of the project (where manage.py is found), but the rest framework thinks it should get the media from the api app.. what's the proper way of doing this? here are screenshots:

the path uploaded to Successful upload path

the path returned in json Path returned by DRF

Upvotes: 3

Views: 3895

Answers (1)

C14L
C14L

Reputation: 12548

The MEDIA_URL setting is the URL path in the browser. The MEDIA_ROOT setting is the root directory on your server, and should be an absolute path.

MEDIA_URL = '/pictures/'

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploaded_pictures')

Also, if you want Product and Store pictures to go into different sub directories, for example pictures/products/ and pictures/store/, you'd need to set the upload_to argument on the model field. For example

picture = models.ImageField(upload_to='products/', ... )

Edit: To serve static and media files during development, add this at the end of the urls.py

if settings.DEBUG:
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns
    from django.conf.urls.static import static

    urlpatterns += staticfiles_urlpatterns()
    urlpatterns += static(
        settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Upvotes: 5

Related Questions