Django ImageField 图像不显示

标签 django image imagefield filefield

我正在尝试使用 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 之外,我的模型运行良好。我的 View 运行良好,我认为那里没有任何问题。

这是我的 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 文件工作正常。我的静态文件中有一个 Logo 图像,它在我的基本模板中呈现。

这是我的 ImageField 模板标签:

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

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

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

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

最佳答案

用于管理面板的 Django ImageField

重要的是,您必须在 urls.py 中定义您的 MEDIA_URL。 没有这个定义框架不会给你访问图像的权限 设置.py

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

网址.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'

管理员.py

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

关于Django ImageField 图像不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48287154/

相关文章:

python - django 在模型自定义保存中访问上传的文件,最佳实践?

Django异步发送通知

python - 在 Django 中创建社交网站的经验

Android 退出时清除图像内存缓存

html - 内联图像和 h (HTML/CSS)

java 。不缩放打印高分辨率图像

python - 使用 django 的 ImageField 检索上传的图像

python - 无法在 Django 测试中登录刚刚创建的用户

python - django动态 zipper 内部服务器错误

django: ImageField, MEDIA_ROOT, MEDIA_URL, 如何正确设置