从ImageField覆盖_get_url()

Fab*_*els 3 django django-models

我正在寻找从ImageField覆盖_get_url方法的最佳方法,我需要自定义url,因为我不想要默认返回的url(我分发此图像以及管理ACL的视图,因此url基于MEDIA_ROOT错了).

我应该创建自己的ImageField吗?或者是否有使用较少代码的解决方案?

在此先感谢Fabien

Ber*_*ant 6

返回的url _get_url实际上是由使用过的Storage类生成的; 创建自己的存储并在创建时使用它可能更有意义ImageField!请参阅:http://docs.djangoproject.com/en/dev/topics/files/#file-storage,http://docs.djangoproject.com/en/dev/howto/custom-file-storage/

您将需要覆盖该Storage.url方法!


Fab*_*els 5

感谢 lazerscience,这是我的最终解决方案:

from django.core.files.storage import FileSystemStorage
from django.db.models import get_model
from django.core.urlresolvers import reverse
from django.db import models
from django.conf import settings


class PhotographerStorage(FileSystemStorage):
    def __init__(self, location=None):
        super(PhotographerStorage, self).__init__(location)

    def url(self, name):
        photo_model = get_model('photographer', 'photo')
        photo = photo_model.objects.get(original_image=name)
        url = super(PhotographerStorage, self).url(name)
        return '%s?size=%d' % (reverse('photographer_photo_display',
            args=[photo.slug]), 300)


fs = PhotographerStorage(location=settings.PHOTOGRAPHER_LOCATION)

class Photo(models.Model):
    ...
    original_image = models.ImageField(storage=fs)
    ...
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力:)