django: ImageField, MEDIA_ROOT, MEDIA_URL, как правильно установить - PullRequest
4 голосов
/ 09 июля 2010

Как правильно установить MEDIA_ROOT и MEDIA_URL в контексте ImageField? Как мне установить upload_to параметр для ImageField? Комментарии для MEDIA_ROOT и MEDIA_URL отсутствуют, поэтому я хотел бы знать, для чего они используются и как их правильно установить.

1 Ответ

8 голосов
/ 09 июля 2010

MEDIA_ROOT - это каталог, куда вы хотите поместить файлы, MEDIA_URL должен быть URL-адресом, который ведет к тому же пути к каталогу.

Параметр upload_to может быть каталогом в этом каталоге, поэтому upload_to = "foo" перейдет в подкаталог "foo" MEDIA_ROOT.

Или это может быть функция, которая берет экземпляр поля изображения и предложенное базовое имя файла и возвращает реальное имя файла, которое вы хотите использовать. Итак

upload_to=get_photo_path 

и

def get_photo_path(instance, filename):
  if not filename: return ""
  exts = re.search('[.]([^.]*)$',filename)
  if exts is None:
    ext  = ''
  else: 
    ext = '.'+exts.group(1)
  return "newname%s" % (ext)

Переименовал файл, но сохранил расширение. Обратите внимание, что "newname. " по-прежнему будет в каталоге MEDIA_ROOT - вам не нужно возвращать "/usr/whwhat/something/foo/newname.". Там уже есть MEDIA_ROOT для вас.

Обновление:

К вашему сведению, приятно знать о

<modelobject>.<imagefieldname>.field.generate_filename( <modelobject>, proposed_name )

Вот как вы можете сгенерировать частичный путь, по которому будет идти изображение, снаружи модели. Вам необходимо вручную добавить MEDIA_ROOT к этому, чтобы сделать его абсолютным путем.

...