在Django Admin中可视化上传图片

6

虽然我在如何正确显示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)
4个回答

3
这个答案已经延迟了至少一年,但是如果您仍然遇到同样的问题,您可以按照以下方式进行修复:
首先,假设您的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_URLMEDIA_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',)

最后,您的媒体文件将拥有这样的URL:

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

django管理面板的截图:

enter image description here

enter image description here


这解决了编辑模式下的图像预览吗? - farynaa

2
你是否尝试过像这样的东西: < p > < em > 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)

那对我总是有效的。如果有帮助,请告诉我。


他应该保留这个模型方法还是替换为另一个? - 101is5

0

当你使用 ImageField 和函数 image_(self) 来使图像可见时,有一条细微的界限。请参见下面的图表: 这是图像的链接 由于我的声誉不允许我发布图片。 img1 列代表您在 models.py 中使用的 imagefile 变量。


ImageField 的图片保存在 images 文件夹中,该文件夹位于 your-project/media/images 目录下。


你的 image_(self) 函数在使用 "media/{0}" 时指向更深一层,即它将指向 your-project/media//media/images (请注意这里的 // 是由 /{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'

0
如果您是Chrome用户,请尝试使用“Web Server for Chrome”扩展程序,您可以在此处找到:https://dev59.com/JFkT5IYBdhLWcg3wIsSw#46480984 Chrome会阻止本地资源的加载,因此该扩展程序会欺骗Chrome以为它正在加载在线资源。
请确保您的src以'http://'开头,例如:
def display_image(self):
    return format_html(
        "<img src='http://127.0.0.1/8887{}'>", 
        self.image_attribute.url
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接