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 к этому, чтобы сделать его абсолютным путем.