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

ただし、シェル (python manage.py shell) で実行すると、完全に機能します。

変でしょ?

4

2 に答える 2

1

正確に何をしようとしていますか?

イメージ名を取得する別の方法を見つける必要があります。このメソッド「render」は、フィールド自体が無効な場合でも、Django によって常に呼び出されます。例えば:

  • 管理者に「me.png」ファイルをアップロードします。
  • 保存をクリック
  • Django は、管理者の別のフィールドが正しくないことを検出し、フォームを返します。
  • 彼は、値パラメーターとして「me.png」を使用して render メソッドを呼び出します。
  • このモデルはまだ保存されていないため、例外が発生します。

ファイル名を取得する方法は他にもあります。たとえば、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 に答える