Chcę przesłać plik użytkownika.

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')

To jest mój abstrakcyjny kod. Ten kod przesyła plik do folderu "Beat".

Chcę jednak zwiększyć skuteczność przechowywania w widoczności. Próbowałem dodać nazwę autora do parametru {x0}} w ten sposób:

upload_to='beat/%s/' %author

Ale to nie udało.

Jak mogę rozwiązać ten problem? Dzięki.

0
yoon 23 luty 2019, 12:34

2 odpowiedzi

Najlepsza odpowiedź

Możesz to zrobić, śledząc

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')

Odniesienie Link

1
Shakil 23 luty 2019, 09:55

Możesz przejść do upload_to funkcję, tak jak:

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

Ta funkcja musi zwrócić 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)

Za pomocą partial można "zamrozić" wywołanie funkcji, przekazywanie zawsze parametry wskazane w połączeniu częściowym, w tym przypadku ścieżka określona w Odel. W czasie wykonywania, funkcja otrzyma argument przekazany z Django (który oczekuje funkcji, która przyjmuje instancję i nazwę pliku dla atrybutu Upload_to), a ten, o którym określono w częściowej. Z tego możesz zwrócić całkowitą ścieżkę

-1
Fran 23 luty 2019, 10:00