Сбой загрузки изображений в 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')
и вот какую ошибку я получаю на веб-странице во время работы
Убедитесь, что в 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')