Поймал DoesNotExist при рендеринге: запрос на сопоставление фотографий не существует - PullRequest
4 голосов
/ 24 августа 2010

Когда я делаю следующее внутри админ-файла:

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

Однако, если я делаю это в оболочке (оболочка python manage.py), она отлично работает!

странно, да?

Ответы [ 2 ]

1 голос
/ 25 августа 2010

Что именно вы пытаетесь сделать?

Вы должны найти другой способ получить имя изображения.Этот метод render все время вызывается Django, даже если само поле недопустимо.Например:

  • Я загружаю файл 'me.png' в администратор.
  • Нажмите сохранить
  • Django обнаруживает, что другое поле в администраторе неверно и возвращаетдля меня.
  • Он вызывает метод рендеринга с me.png в качестве параметра значения.
  • Вы получаете исключение, так как эти модели еще даже не сохранены.

Есть и другие способы получить имя файла, вы можете переопределить метод save и получить экземпляр объекта, например.

0 голосов
/ 26 августа 2010

Я решил проблему, но чувствую, что должно быть более элегантное решение.

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

Проблема в том, что вам придется предварительно кэшировать миниатюры.

EDIT:

Странно ... Теперь это работает ...

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