Django:上传的文件工作完美......除了管理员

时间:2014-04-08 03:33:46

标签: django django-admin

我有一件衬衫的Django模特。这是相关部分:

class Shirt(models.Model):
    front_image = models.ImageField(upload_to="shirt_fronts")

class ShirtAdmin(admin.ModelAdmin):
    pass

一般来说效果很好;我可以在管理员中创建新衬衫,并为他们上传图片。然后,我可以在衬衫视图中查看这些衬衫,它们显示得很好。

唯一的问题是管理员本身。上传图像后,图像本身不会出现,只有链接到图像的路径(例如shirt_fronts/someImage.jpg)。如果我然后点击链接,我会被带到图像的错误路径(不出所料)不起作用。

所以我的问题是,我该如何解决这个问题?具体来说,我如何才能将链接转到正确的位置或(更好的是)将该链接作为图像或缩略图版本?

2 个答案:

答案 0 :(得分:2)

Django没有通过defaut显示缩略图。关于如何在django admin中显示上传图像有几个答案。

This should help you

对于断开的链接,django不提供开箱即用的媒体文件。但是,您可以将其配置为在调试模式下为它们提供服务。

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

For more information on how to serve static files in django

答案 1 :(得分:0)

我最终使用此处的代码处理图像:http://www.psychicorigami.com/2009/06/20/django-simple-admin-imagefield-thumbnail/

我创建了一个admin_image_widget.py文件:

from django.contrib.admin.widgets import AdminFileWidget
from django.utils.translation import ugettext as _
from django.utils.safestring import mark_safe

class AdminImageWidget(AdminFileWidget):
    def render(self, name, value, attrs=None):
        output = []
        if value and getattr(value, "url", None):
            image_url = '/media/dynamic/' + value.url
            file_name=str(value)
            output.append(u' <a href="%s" target="_blank"><img src="%s" alt="%s" style="height: 100px; width: 100px;"/></a> %s ' % \
                (image_url, image_url, file_name, _('Change:')))
        output.append(super(AdminFileWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))

(注意:我修改了图片网址和图片代码。图片网址我可以通过使用静态文件代码而不是硬编码路径来做得更好。我调整了图像标记以限制缩略图的大小。 )

然后我将我的衬衫管理课程移到了admin.py并成功了:

class ShirtAdmin(admin.ModelAdmin):

    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name == 'front_image':
            request = kwargs.pop("request", None)
            kwargs['widget'] = AdminImageWidget
            return db_field.formfield(**kwargs)
        return super(ShirtAdmin,self).formfield_for_dbfield(db_field, **kwargs)

admin.site.register(Shirt, ShirtAdmin)

这一起让我的管理员缩略图!感谢Psychic Origami博客的代码片段,感谢Bigcortex让我朝着正确的方向前进。