Вы можете передать upload_to
функцию, например:
mbeat = models.ImageField(upload_to=upload_to_path(path='beat'),
default = 'static/None/No-beat.mp3')
Эта функция должна возвращать partial
def upload_to_path(path):
return partial(_get_upload_to_path, path=path)
def _get_upload_to_path(instance, filename, path):
"""
:param instance: instance of the model
:param filename: filename of the uploaded file
:param path: path to the directory where to upload
:return: complete path with filename
"""
return os.path.join(path, instance.author, filename)
С partial
вы можете "заморозить"«вызов функции, передающей всегда параметры, указанные в частичном вызове, в этом случае путь, указанный в оделе.Во время выполнения функция получит аргумент, переданный из django (который ожидает функцию, которая принимает экземпляр и имя файла для атрибута upload_to) и тот, который вы указали в частичном.От этого вы можете вернуть полный путь