我正在寻找从ImageField覆盖_get_url方法的最佳方法,我需要自定义url,因为我不想要默认返回的url(我将这个图像分发到一个视图来管理它上面的ACL所以基于MEDIA_ROOT的url是错误的。)
我是否必须创建自己的ImageField?或者是否有使用较少代码的解决方案?
提前致谢 法比安
答案 0 :(得分:6)
返回的网址_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
方法!
答案 1 :(得分:4)
感谢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)
...
它就像一个魅力:)