django: ImageField, MEDIA_ROOT, MEDIA_URL, как правильно установить

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

1 ответ

Решение

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/what / что-то / foo / newname.". Он уже использует MEDIA_ROOT для вас.

Обновить:

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

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

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

Другие вопросы по тегам