Django 上的损坏图像

Broken Images on Django

我在 django 上的图像损坏了。我猜下面是带有代码的相关信息。我是 django 的新手,如有任何信息,我们将不胜感激。

project/site=图片站点的名称
应用名称=图库

在models.py,

class Photo(models.Model):
    pub_date = timezone.now()
    image = models.ImageField(upload_to='images')

在 views.py、

def view_gallery(request):
    photo_list = Photo.objects.all()
    return render(request, 'gallery/view_gallery.html', {'photo_list' : photo_list})

在view_gallery.html,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Gallery</title>
</head>
<body>

    {% csrf_token %}
    {% for photo in photo_list.all %}

        <img src="{{ photo.image.url }}" width="240">
        <h2> {{ photo.pub_date }} </h2>
        <br>

    {% endfor %}

</body>
</html>

在settings.py,

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

在imagesite/urls.py,

urlpatterns = [
    path('imagesite/', include('gallery.urls')),
    path('admin/', admin.site.urls),
]

在gallery/urls.py,

urlpatterns = [

    path('', views.view_gallery, name='view_gallery'),

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

您的 static() url 应该添加到主 urls.py 文件,而不是您的 gallery/urls.py。现在你在它们前面加上 /imagesite/ 所以基本上你告诉 django 创建 urls /imagesite/media/ 而不是 /media/.

此外,为了清楚起见:这是一个 url 设置,应该 仅用于开发 ,而不用于生产。所以最好在你的 main urls.py:

中这样做
from django.conf import settings

urlpatterns = [
    path('imagesite/', include(gallery.urls)),
    ...
]

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

最后,不要假设路径为“/”,正如您在 Windows 上看到的那样,路径分隔符是“\”。您的 MEDIA_ROOT 设置在文件夹 "imagesite":

中创建文件夹 "imagesite/media" 而不是文件夹 "media"
MEDIA_ROOT = os.path.join(BASE_DIR, 'imagesite', 'media')