在Django Admin中可视化上传的图像

时间:2016-03-23 11:49:19

标签: python django django-models django-admin media-url

虽然我已经找到了有关如何在Django-Admin(#1#2#3)中正确显示图片的有用帖子,但我到目前为止遵循这些好建议并不成功。如下所示,上传的图像无法正确显示,并且正在显示404错误。

下图说明了上传的图像虽然已成功上传到服务器上但未显示的事实: Broken links for uploaded images

当我在断开的链接上单击鼠标时,浏览器上会显示以下错误: URL Error

编辑给定对象时,我也想知道如何显示缩略图 而不是图像的路径: URL to image 下面,您可以找到我目前使用的配置:

settings.py

import os
PROJECT_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..').replace('\\','/')
SITE_ROOT = PROJECT_ROOT

# Path to media files, e.g. images
MEDIA_ROOT = os.path.join(SITE_ROOT, 'media')
MEDIA_URL = '/media/'

urls.py

from django.conf.urls import patterns, include, url
from django.conf.urls.static import static
from django.conf import settings
from . import views

urlpatterns = patterns('',
    # some url configs here ... removed for simplification purposes ;-)
)

if settings.DEBUG is True:
    urlpatterns += patterns('', (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}) )
    #urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

models.py

class Image(models.Model):
    title = models.CharField(db_column='title', max_length=180, blank=True, null=True, help_text="Title of the image") 
    imagefile = models.ImageField(db_column='imagefile', upload_to='images', null=True, blank=True, help_text="Load an image.")
    #... some other fields here, removed for simplification purposes ;-)

    def image_(self):
        return '<a href="/media/{0}"><img src="/media/{0}"></a>'.format(self.imagefile)
    image_.allow_tags = True

    class Meta:
        managed = False
        db_table = 'image'

    def __unicode__(self):
        return u'%s' % (self.title)

admin.py

from django.contrib import admin
from .models import Image

class ImageAdmin(admin.ModelAdmin):
    list_display = ('title', 'description', 'image_', )
    search_fields = ('title', 'description')
    list_per_page = 25

admin.site.register(Image, ImageAdmin)

3 个答案:

答案 0 :(得分:2)

你试过这样的事吗:

admin.py

from django.contrib import admin
from .models import Image

class ImageAdmin(admin.ModelAdmin):
    list_display = ('title', 'description', 'image_display', )
    search_fields = ('title', 'description')
    list_per_page = 25

    def image_display(self, obj):
        return '<a href="/media/{0}"><img src="/media/{0}"></a>'.format(self.imagefile.url)
    image_.allow_tags = True
    image.short_descripition = u'IMAGE'

admin.site.register(Image, ImageAdmin)

这总是对我有用。如果有帮助,请告诉我。

答案 1 :(得分:1)

这个答案推迟了至少一年,但是,如果你仍然遇到同样的问题,你可以这样解决:

首先,让我们假设您的django项目具有此架构并且您正在运行 django 2.0

. django_test
|_ django_test
|  |_ __init__.py
|  |_ settings.py
|  |_ urls.py
|  |_ wsgi.py
|_ media
|  |_ author_headshot
|_ my_app
|  |_ admin.py
|  |_ __init__.py
|  |_ apps.py
|  |_ migrations
|  |_ models.py
|  |_ tests.py
|  |_ urls.py
|  |_ views.py
|_ static
|_ templates

然后,添加 django_test / settings.py

# static files will be stored in 'static' folder
STATIC_URL = '/static/'
STATICFILES_DIR = [
    BASE_DIR + '/static'
]
# media files will be stored in 'media' folder
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR + '/media'

然后,在 django_test / urls.py 中,请确保添加 MEDIA_URL MEDIA_ROOT 的静态路径,如下例所示:

from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    # More paths/urls
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

最后,在您的应用程序模型中,您可以为每个存储媒体文件的ImageField添加一个唯一的文件夹,如下例所示:

my_app / models.py

from django.db import models
from django.utils.html import format_html

class Author(models.Model):
    # My models ...
    # Here, the media files will be stored in my_project/media/author_headshot
    headshot = models.ImageField(upload_to='author_headshot')

    # If you want to show the media files in the list display in the admin panel:
    def image_tag(self):
        return format_html('<img href="{0}" src="{0}" width="150" height="150" />'.format(self.headshot.url))

    image_tag.allow_tags = True
    image_tag.short_description = 'Image'

然后,在 my_app / admin.py

from django.contrib import admin
from . import models

@admin.register(models.Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('image_tag')

最后,您的媒体文件将包含以下类型的网址:

  

http://example.domain/media/file_path.extension

django管理面板的屏幕截图:

enter image description here

enter image description here

答案 2 :(得分:0)

当您使用 ImageField 并且使用 image_(self)功能使图像可见时,有一条细线。见下图: this is the link of the image 因为我的声誉不允许我发布图片。 img1 列代表您在 models.py imagefile 变量> 即可。

ImageField 的图像保存在images文件夹中,该文件夹是你的项目/媒体/图片目录。

当您使用“媒体/ {0} ”时, image_(自我)功能指向更深层次,即它将指向您的 - 项目/媒体//媒体/图像 (注意//这里是由于额外/ / {0}而来的)。您的功能应修改如下:

def image_tag(self):
    return '<a href="{0}"><img src="{0}" width = "120" height = "120"></a>'.format(self.img1.url)
image_tag.allow_tags = True
image_tag.short_description = 'y-Image'