2010-09-02 4 views
2

Я играл с django-photologue некоторое время и нашел это отличной альтернативой всем другим приложениям для обработки изображений.django-photologue upload_to

Одна вещь, хотя, я также использую django-cumulus, чтобы подтолкнуть мои загрузки к моему CDN вместо того, чтобы запускать его на моем локальном компьютере/сервере.

Когда я использовал imagekit, я всегда мог передать upload_to='whatever', но я не могу сделать это с помощью фотолога, поскольку он автоматически вставляет поле изображения. Как я могу добиться какой-то перезаписи?

С уважением

ответ

1

Я думаю, что вы можете подключить в pre_save сигнала модели Фото, и изменить поле upload_to, как раз перед экземпляр сохраняется в базе данных.

Взгляните на это: http://docs.djangoproject.com/en/dev/topics/signals/

+0

ОК, я рассмотрю его, однако, как правило, у меня разные CDN, основанные на определенных аспектах проекта. Вы по-прежнему рекомендуете этот способ? – ApPeL

+0

@ApPel, я бы предпочел, чтобы изменения не были внесены в код третьей стороны (фотолог в этом случае). Внутри обработчика сигнала вы можете определить, какой путь вы хотите сохранить. – OmerGertel

+0

ОК, круто. Я посмотрю на это – ApPeL

0

удалось найти обходной путь для этого, однако это требует, чтобы внести изменения в photologue/models.py

if PHOTOLOGUE_PATH is not None: 
    if callable(PHOTOLOGUE_PATH): 
     get_storage_path = PHOTOLOGUE_PATH 
    else: 
     parts = PHOTOLOGUE_PATH.split('.') 
     module_name = '.'.join(parts[:-1]) 
     module = __import__(module_name) 
     get_storage_path = getattr(module, parts[-1]) 
else: 
    def get_storage_path(instance, filename): 
     dirname = 'photos' 
     if hasattr(instance, 'upload_to'): 
      if callable(instance.upload_to): 
       dirname = instance.upload_to() 
      else: dirname = instance.upload_to 
     return os.path.join(PHOTOLOGUE_DIR, 
         os.path.normpath(force_unicode(datetime.now().strftime(smart_str(dirname)))), 
         filename) 

, а затем в ваших приложениях модели делают следующее:

class MyModel(ImageModel): 
    text = ... 
    name = ... 

    def upload_to(self): 
     return 'yourdirectorynamehere' 
0

Вы можете использовать настройку PHOTOLOGUE_PATH, чтобы обеспечить свой собственный вызываемый. Определите метод, который принимает экземпляр и имя файла как параметры, затем возвращает все, что вы хотите. Например, в вашем settings.py:

import photologue 

... 

def PHOTOLOGUE_PATH(instance, filename): 
    folder = 'myphotos' # Add your logic here 
    return os.path.join(photologue.models.PHOTOLOGUE_DIR, folder, filename) 

Предположительно (хотя я не проверял это), вы могли бы узнать больше о экземпляре Фото (например, что другие случаи он относится к) и выберите папку, соответственно.

Смежные вопросы