Сбой загрузки изображений в Django

Я использую django для загрузки изображения в базу данных (POST запрос) и отображения его на сайте. но по какой-то причине мое изображение не загружается

models.py -

from django.db import models


class image_classification(models.Model):
    pic=models.ImageField(upload_to='images')

views.py

from django.shortcuts import render
from .models import image_classification
from django.http import HttpResponse, HttpResponseRedirect


# def home(request):
#     print('here you go ')
#     images=image_classification.objects.all()
#     url=images[len(images)-1].pic.url
#     return render(request,'home.html',{'print':'everything is ok','image':url})


def home(request):
    print('here you go ')
    images=[]
    images=image_classification.objects.all()

    if len(images) > 0:
     url=images[len(images)-1].pic.url
    else:
      url="place holder image url"
    return render(request,'home.html',{'print':'everything is ok','image':url})

#handles uploaded images
def uploadImage(request):
    print('image handling ')
    img= request.FILES['image']
    image=image_classification(pic=img)
    image.save()
    return HttpResponseRedirect('/')

url приложения

from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('',views.home,name='home')
]

urlpatterns+= static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

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


url.py для проекта (если он вам понадобится)

 
from django.contrib import admin
from django.urls import path, include
from ImageClassifier import views
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    path("admin/", admin.site.urls),
    path('', include('ImageClassifier.urls')),
]

последний settings.py (не уверен, нужен ли он)


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


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

и вот какую ошибку я получаю на веб-странице во время работы

enter image description here

Убедитесь, что в urls.py проекта есть следующий код:

from django.contrib import admin
from django.urls import path, include
from ImageClassifier import views
from django.conf.urls.static import static
from django.conf import settings


urlpatterns = [
    path("admin/", admin.site.urls),
    path('', include('ImageClassifier.urls')),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Я думаю, что причина, по которой ваше изображение не загружается, заключается в том, что вы не проверяете, является ли request.method методом POST Попробуйте это и посмотрите, работает ли это

views.py для сохранения в базе данных

from django.shortcuts import render, redirect

def image(request):
    if request.method == "POST":
        image = request.FILES.get("image")
        pic = Image.objects.create(pic=image)
        pic.save()
        return redirect('/')
    return render(request, "image.html", {})

template.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action=/image/ method="post" enctype="multipart/form-data"> 
        {% csrf_token %} 
        <input type="file" name="image"> 
        <input type="submit" value="upload file"> 
    </form> 
</body>
</html>

Ссылка на проект

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    path("admin/", admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Url приложения

from django.urls import path

from . import views

urlpatterns = [
    path("image/", views.image, name="image"),
]

И последнее, settings.py

BASE_DIR = Path(__file__).resolve().parent.parent
MEDIA_ROOT = BASE_DIR / "media"
MEDIA_URL = "/media/"

P.S.: Когда вы хотите дать имя классу, всегда используйте прописные буквы или PascalCase для именования. Вы можете прочитать о соглашении об именовании в python здесь. Следовательно, ваша модель будет выглядеть примерно так

class ImageClassification(models.Model):
    pic=models.ImageField(upload_to='images')
Вернуться на верх