Django ImageField图像未显示

时间:2018-01-16 17:52:24

标签: django image imagefield filefield

我试图使用Django 2.0。我正在使用开发运行服务器'现在,所以请记住,我还没有投入生产。我熟悉两者在静态文件方面的差异。

我有一个Blog Post模型。在管理员中,我希望能够使用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文件夹和my / media文件夹位于同一目录中。这些都在我的app目录/ blog中。

有人可以在这里看到任何明显的错误,还是可以提出建议?我的问题是默认图像没有加载。默认图像IS位于正确的目录/ media / img /中。控制台警告说&#34;未找到:/media/img/default.png"。

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

2 个答案:

答案 0 :(得分:0)

打印媒体根帮助我解决了这个问题。谢谢Alasdair。

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

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

由于在控制台中打印了我的MEDIA_ROOT,我对“设置”所做的更改已完成。我改变了斜杠的语法和方向(blog \ media)。我还在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">

答案 1 :(得分:0)

用于管理面板的Django ImageField

您必须在 urls.py 中定义 MEDIA_URL ,这一点很重要。 没有这个定义框架就不会授予您访问图像的权限 Setting.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)

Models.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',)