【问题标题】:Caught DoesNotExist while rendering: Photo matching query does not exist渲染时捕获 DoesNotExist:照片匹配查询不存在
【发布时间】:2011-04-03 07:54:52
【问题描述】:

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

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) 中执行此操作,它会完美运行!

很奇怪吧?

【问题讨论】:

  • 你能从 shell 中尝试以下行,看看它是否有效? photo = Photo.objects.get(original_image__exact=file_name)
  • 是的,我已经这样做了。很抱歉不太清楚。
  • 好的,和使用控制台无关。如果我从数据库中复制文件名('photos/08-2010/placeholder2_2.png')然后写:photo = Photo.objects.get(original_image__exact='photos/08-2010/placeholder2_2.png'),我会得到我希望的结果。我只需要找出字符串不同的原因。

标签: django django-widget imagekit django-imagekit


【解决方案1】:

你到底想做什么?

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

  • 我在后台上传了“me.png”文件。
  • 点击保存
  • Django 发现 admin 中的另一个字段不正确,并将表单返回给我。
  • 他以“me.png”作为值参数调用渲染方法。
  • 您会遇到异常,因为此模型甚至尚未保存。

还有其他方法可以获取文件名,例如你可以重写save方法并获取对象实例。

【讨论】:

【解决方案2】:

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

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))

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 2013-07-27
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2022-01-08
    • 2015-12-29
    相关资源
    最近更新 更多