Images are not appearing

I have this structure

my models

class Post(models.Model):
    title = SummernoteTextField()
    title_ar = SummernoteTextField()
    image = models.ImageField(upload_to='blog/static/blog/images',blank=True, null=True)
    body = models.TextField(null=False)
    body_ar = models.TextField(null=False)
    author = SummernoteTextField(max_length=30, null=True)
    author_ar = SummernoteTextField(max_length=30, null=True)
    created_on = models.DateTimeField(auto_now_add=True)
    categories = models.ManyToManyField("Category", related_name="posts")

    def __str__(self):
        return self.title

these are my urls

urlpatterns = [
    path('i18n/', include('django.conf.urls.i18n')),

urlpatterns += i18n_patterns(
    path('blog/', include("blog.urls")),
    path('summernote/', include('django_summernote.urls'))
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

these are my media and static settings

STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

I upload images via admin panel.

I get this error in terminal:

Not Found: /blog/static/blog/images/maket2.png
GET /blog/static/blog/images/maket2.png HTTP/1.1" 404 2514

The path shown when I inspect images in developer tools

How I added images

<img src="/{{post.image}}">

Don’t confuse the purpose and usage of static files vs media files.

Static files are files that are part of the project itself. Media files are files uploaded while the system is running.

You manage the two sets of files differently, they are not handled the same.

It also matters whether you’re talking about your development environment or your production environment.

In a production-quality deployment, neither of those directories (STATIC_ROOT and MEDIA_ROOT) should be in your project. They should refer to directories outside your project directory, in locations that your web server will have access to.

With that information, see:

Some of the items I see:

  • Your upload_to appears to be referencing your static file directory.
  • You don’t display images by referencing the “image” attribute. You use the url attribute to have Django create the url for a media file.

Also, for full diagnostics here, we’d need to know what web server you’re using and how it is configured for your static and media files.

1 Like

Thanks, @KenWhitesell, I’m in the development phase, using Django server.
Can you recommend resources to read more about the difference between media and static files?

what I did and make my photos appear is :

  • changed the upload_to path to a new folder that isn’t for the static files.
  • used the url attribute with the src.
  • MEDIA_ROOT and MEDIA_URL are the same.

That’s really all there is to it as far as the difference between them.

When you are moving this into production, you are going to want MEDIA_ROOT and STATIC_ROOT pointing to directories outside your project directory.

1 Like