Django upload_to по имени пользователя - PullRequest
0 голосов
/ 23 февраля 2019

Я хочу загрузить файл по имени пользователя.

class Beat(models.Model):
    title       = models.CharField(max_length=100, blank=True, default='')
    author      = models.CharField(max_length=100, blank=True, default='')
    owner       = models.ForeignKey(User, related_name='beats', on_delete=models.CASCADE, default='', blank=True, null=True)

    mbeat = models.FileField(upload_to='beat/', default = 'static/None/No-beat.mp3')

Это мой абстрактный код.Этот код загружает файл в папку «beat».

Однако я хочу сделать хранилище более эффективным в видимости.Я пытался добавить имя автора к параметру upload_to следующим образом:

upload_to='beat/%s/' %author

, но это не помогло.

Как я могу решить эту проблему?Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Вы можете передать 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) и тот, который вы указали в частичном.От этого вы можете вернуть полный путь

0 голосов
/ 23 февраля 2019

Вы можете сделать это следующим образом

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/beat/author/<filename>
    return 'beat/{0}/{1}'.format(instance.author, filename)

class Beat(models.Model):
    title       = models.CharField(max_length=100, blank=True, default='')
    author      = models.CharField(max_length=100, blank=True, default='')
    owner       = models.ForeignKey(User, related_name='beats', on_delete=models.CASCADE, 
    default='', blank=True, null=True)
    upload = models.FileField(upload_to=user_directory_path,  default = 'static/None/No-beat.mp3')

Ссылка ссылка

...