4

当我在管理文件中执行以下操作时:

photo = Photo.objects.get(original_image__exact=file_name) 
val = photo.admin_thumbnail.url

我收到此错误:

Caught DoesNotExist while rendering: Photo matching query does not exist.

这是我的课:

class AdminImageWidget(forms.FileInput):
    """
    A ImageField Widget for admin that shows a thumbnail.
    """

    def __init__(self, attrs={}, *args, **kwargs):
        super(AdminImageWidget, self).__init__(attrs)

    def render(self, name, value, attrs=None):
        output = []
        file_name = unicode(value)

        if file_name:
            photo = Photo.objects.get(original_image__exact=file_name) 
            val = photo.admin_thumbnail.url

            output.append(('<a target="_BLANK" href="%s">'
                           '<img src="%s" /></a> '
                           % (val, val)))
        output.append(super(AdminImageWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))

但是,如果我在 shell (python manage.py shell) 中执行此操作,它会完美运行!

奇怪吧?

4

2 回答 2

1

你到底想做什么?

您应该找到另一种获取图像名称的方法。Django 一直调用此方法“render”,即使字段本身无效。例如:

  • 我在管理员中上传了“me.png”文件。
  • 点击保存
  • Django 发现 admin 中的另一个字段不正确,并将表单返回给我。
  • 他以“me.png”作为值参数调用渲染方法。
  • 你得到一个例外,因为这个模型甚至还没有保存。

还有其他获取文件名的方法,例如,您可以覆盖 save 方法并获取对象实例。

于 2010-08-25T16:39:42.233 回答
0

我已经解决了这个问题,但我觉得应该有一个更优雅的解决方案。

class AdminImageWidget(forms.FileInput):
    """
    A ImageField Widget for admin that shows a thumbnail.
    """

    def __init__(self, attrs={}, *args, **kwargs):
        super(AdminImageWidget, self).__init__(attrs)

    def render(self, name, value, attrs=None):
        output = []

        file_name = unicode(value)

        if file_name:
            pattern = re.compile('.png', re.IGNORECASE)
            val = '/media/photos_cache/' + pattern.sub('_admin_thumbnail.png', file_name)

            output.append(('<a target="_BLANK" href="%s">'
                           '<img src="%s" /></a> '
                           % (val, val)))
        output.append(super(AdminImageWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))

问题是您必须预先缓存缩略图。

编辑:

奇怪……现在可以了……

class AdminImageWidget(forms.FileInput):
    def __init__(self, attrs={}, *args, **kwargs):
        super(AdminImageWidget, self).__init__(attrs)

    def render(self, name, value, attrs=None):
        output = []

        file_name = unicode(value)

        if file_name:
            photo = Photo.objects.get(original_image=file_name)

            val = photo.admin_thumbnail.url

            output.append(('<a target="_BLANK" href="%s">'
                           '<img src="%s" /></a> '
                           % (val, val)))
        output.append(super(AdminImageWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))
于 2010-08-26T11:00:31.753 回答