【问题标题】:Django: Uploaded Files Work Perfect ... Except in AdminDjango:上传的文件工作完美......除了在管理员
【发布时间】:2014-04-08 03:33:46
【问题描述】:

我有一个用于衬衫的 Django 模型。以下是相关部分:

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

class ShirtAdmin(admin.ModelAdmin):
    pass

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

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

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

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    Django 默认不显示缩略图。关于如何在 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

    【讨论】:

    • 感谢您的想法,但我已经在为静态媒体服务了;正如我在我的问题中所说,图像在我的网站上显示得很好,只是在管理员中它们不起作用。至于您链接到的问题,我尝试从我的模型的答案中添加def image_thumb 方法,但它似乎没有做任何事情:(
    【解决方案2】:

    我最终得到了使用此处代码的图像: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))
    

    (注意:我修改了图像 URL 和图像标签。使用静态文件代码而不是硬编码路径,我可能会做得更好。我调整了图像标签以限制缩略图的大小。 )

    然后我将我的衬衫管理类移到了 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 博客提供的代码 sn-p,并感谢 Bigcortex 让我找到了正确的方向。

    【讨论】:

      猜你喜欢
      • 2016-11-02
      • 2019-08-27
      • 2015-06-20
      • 2013-09-07
      • 2014-07-18
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      相关资源
      最近更新 更多