如何解决Django MEDIA_ROOT路径不一致问题以显示缩略图?

发布时间:2020-07-07 16:17

我正在尝试从ImageField获取缩略图以显示在Django 3.0.4网站中。

当我在外壳中创建名为Resource的模型的实例时,可以从MEDIA_ROOT / default_thumbnails目录中获取文件对象,并将其用于实例中的ImageField。 resource.thumbnail返回一个ImageFieldFile。当我在django管理员中查看该对象的详细信息视图时,它列出了我期望的缩略图文件的正确路径:

/home/rob/development/eh/eduhwy/media/default_thumbnails/xyz.jpg

当我访问站点中该资源的详细信息视图时,它还会列出上面的文件路径。但是它不显示图像。而且,当我单击链接时,出现错误消息,指出以下路径不存在:

/home/rob/development/eh/eduhwy/media/home/rob/development/eh/eduhwy/media/default_thumbnails/xyz.jpg

重复的“ / home / rob / development / eh / eduhwy / media ”使我怀疑某个地方存在额外的斜杠或配置错误的路径,但我找不到它。

更重要的是,如果我通过管理员使用完全相同的图像文件创建资源,那么一切正常。

相关settings.py:

import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

ROOT_URLCONF = 'eduhwy.urls'

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

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

models.py:

class Resource(models.Model):
    """
    A standalone piece of content
    that forms the basis of a course

    Attributes:

        title: The human readable title of the resource.
        thumbnail: Small image that shows in content listings.
    """

    title = models.CharField(max_length=256)
    thumbnail = models.ImageField(blank=True,
                                  null=True,
                                  max_length=512,
                                  upload_to='resource_thumbnails',
                                  default='default.jpg')

urls.py:

# haven't had a chance to move to new URL patterns yet
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import include
from django.urls import path
from django.urls import re_path

from eduhwy.views import HomePageView

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('org/', include('eduhwy.apps.educore.urls')),
    re_path(r'^content/', include('eduhwy.apps.education_content.urls')),
    re_path(r'^engagement/', include('eduhwy.apps.engagement.urls')),
    re_path(r'^api/', include('eduhwy.apps.api.urls')),
    re_path(r'^$', HomePageView.as_view(), name='homepage'),
]

# This magic line is needed for css files to show up
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

# This magic line is needed for user-uploaded content, such as resource
# thumbnails, to show up.
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
        path('__debug__/', include(debug_toolbar.urls)),
    ] + urlpatterns

以下是shell会话中的代码段:

ipdb> resource = Resource.objects.get(pk=1)
ipdb> resource                                                                  
<Resource: Therapeutics for an external protection  downstream of approach.>
ipdb> resource.thumbnail                                                        
<ImageFieldFile: /home/rob/development/eh/eduhwy/media/default_thumbnails/xyz.jpg>
ipdb> default_thumbnail_path                                                    
'/home/rob/development/eh/eduhwy/media/default_thumbnails'

当我在管理员中查看类似资源时,路径是正确的:

correct path in django admin

但是当我单击以蓝色突出显示的链接时,我得到了:

error about missing path

如上所述,如果我通过管理员手动添加资源,踢球器就可以工作。请注意,此处的文件路径不同,将图像按预期存储在resource_thumbnails中,而不是完整路径:

correct image generation through django admin

回答1