2010-07-06 5 views
3

Я ищу наилучший способ переопределить метод _get_url из ImageField, мне нужно настроить URL-адрес, так как я не хочу, чтобы возвращаемый по умолчанию URL-адрес (я распространяю это изображение. управляйте ACL, поэтому URL-адрес на основе MEDIA_ROOT неверен).Overriding _get_url() from ImageField

Должен ли я создать свой собственный ImageField? или есть решение, использующее меньше кода?

Заранее спасибо Фабен

ответ

6

URL-адрес возвращается быть _get_url фактически порожден используемым классом хранения; возможно, было бы разумнее создать собственное хранилище и использовать его при создании ImageField! См: http://docs.djangoproject.com/en/dev/topics/files/#file-storage, http://docs.djangoproject.com/en/dev/howto/custom-file-storage/

Вы NEET переопределить метод Storage.url для этого!

+0

Я думал, URL-адрес был управляемой моделью. Теперь, это имеет смысл, спасибо :) –

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

Он работает как шарм :)