【问题标题】:Django ImageField Image Not DisplayingDjango ImageField 图像不显示
【发布时间】:2018-01-16 17:52:24
【问题描述】:

我正在尝试使用 Django 2.0。我现在正在使用开发“runserver”,所以请记住我还没有投入生产。我熟悉两者在静态文件方面的区别。

我有一个博客帖子模型。在管理员中,我希望能够使用 ImageField 将图像添加到我的模型中。我希望它是可选的,如果没有添加则提供默认图像。

我可以在管理员中加载图像。我无法在我的模板中呈现我的图像。控制台显示 Django 正在尝试获取我的图像,但我的配置到目前为止还没有工作。

这是我的模型和相关领域:

from PIL import Image

class Post(models.Model):
    ....
    thumbnail = models.ImageField(default='/img/default.png', upload_to='img', blank=True, null=True)
    ....

我的模型在 ImageField 之外运行良好。我的观点运作良好,我认为那里没有任何问题。

这是我的 urls.py

....
from django.conf.urls.static import static
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from . import views   

urlpatterns = [
....
path('posts/', views.PostListView.as_view(), name='post_list'),
path('post/<int:pk>/', views.PostDetailView.as_view(), name='post_detail'),
path('post/random/', views.random_post, name='random_post'),

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

我完全不确定如何在我的 urls.py 中处理静态文件和媒体文件,尤其是在 2.0 版中对 Django 进行了更改。

这是我的相关设置。

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ....
                'django.contrib.messages.context_processors.media',
                ....
                ]
         },
    },
]

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

我同样不确定在我的 settings.py 中添加有关媒体的内容。我的静态 CSS 文件运行良好。我的静态文件中有一个徽标图像,它在我的基本模板中呈现。

这是我的 ImageField 模板标签:

<img class="card-image mr-3" src="{{ post.thumbnail.url }}" alt="Generic placeholder image">

最后,我的 /static 文件夹和我的 /media 文件夹在同一个目录中。这些都在我的应用程序目录 /blog 中。

任何人都可以在这里看到任何明显的错误,或者他们可以提出建议吗?我的问题是默认图像未加载。默认图像位于正确的目录 /media/img/ 中。控制台警告显示“未找到:/media/img/default.png”。

提前致谢。任何建议都会有所帮助。

【问题讨论】:

  • MEDIA_ROOT 的评估结果是什么?你确定你需要replace()吗?我会将默认值更改为 default='img/default.png' 而不使用前导斜杠。但是,我认为这两者都不是真正的问题。
  • 我将在 Settings.py 中取出 replace()。我将更改前导斜杠。如何评估 MEDIA_ROOT?我复制了图片上的网址。 127.0.0.1:8000/media/img/default.png。它没有找到 /media/img/default.png 但图像在这些目录中。
  • 只需将print(MEDIA_ROOT) 添加到您的设置中即可检查其值。
  • 谢谢。我解决了。我在 MEDIA_ROOT 中遗漏了我的应用名称。

标签: django image imagefield filefield


【解决方案1】:

用于管理面板的 Django ImageField

您必须在 urls.py 中定义您的 MEDIA_URL。 没有此定义框架不会授予您访问图像的权限 设置.py

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

urls.py

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

模型.py

class Product(models.Model):
    title = models.CharField(max_length=150)
    image=models.ImageField(blank=True,upload_to='images/')

    def __str__(self):
       return self.title

    def image_tag(self):
        return mark_safe('<img src="{}" height="50"/>'.format(self.image.url))
    image_tag.short_description = 'Image'

Admin.py

class ProductAdmin(admin.ModelAdmin):
list_display = ['title','image_tag']
readonly_fields = ('image_tag',)

【讨论】:

    【解决方案2】:

    打印媒体根目录帮助我解决了这个问题。谢谢阿拉斯代尔。

    我认为上面的模型字段没有任何问题。

    我最终使用的 urls.py 代码直接来自 Django 文档,用于 Django 2.0 处理静态文件 https://docs.djangoproject.com/en/2.0/howto/static-files/

    我对设置所做的更改是通过在控制台中打印我的 MEDIA_ROOT 来完成的。我更改了斜杠的语法和方向(博客\媒体)。我还在我的 TEMPLATES 选项中删除了上面显示的上下文处理器。

    这对我有用:

    models.py

    thumbnail = models.ImageField(default='img/default.png', upload_to='img', blank=True, null=True)
    

    urls.py

    from django.conf.urls.static import static
    from django.conf import settings
    
    urlpatterns = [...] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

    settings.py

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

    模板标签

    <img class="card-image mr-3" src="{{ post.thumbnail.url }}" alt="Generic placeholder image">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-08
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多