Загрузка файлов в Django: запретить FileField записывать полный путь к базе данных - PullRequest
2 голосов
/ 28 мая 2009

Я строю хранилище программного обеспечения поверх фреймворка Django. Поскольку он будет содержать много файлов, я хочу, чтобы он имел какой-то смысл при просмотре через файловый менеджер. Поэтому я сгруппировал файлы сначала по URL-адресу программы, которой они принадлежат, а затем по первым двум буквам этого URL-адреса. Вот как это выглядит:

screenshot of my directory structure

Схема выглядит следующим образом:

class File(models.Model):
    # If called like upload_to, don't put a slash in front of the result
    # because we already have one in settings.MEDIA_ROOT
    def get_absolute_url(self, filename=None):
        return '%sfiles/%s/%s/%s' % ('' if filename else '/',
                                     self.download.url[:2],
                                     self.download.url,
                                     filename or self.name)
    name = models.FileField(upload_to=get_absolute_url, max_length=255)
    size = models.IntegerField()
    title = models.CharField(blank=True, max_length=255)
    download = models.ForeignKey('Download', related_name='files')


class Download(models.Model):
    url = models.SlugField(unique=True, max_length=255)
    title = models.CharField(max_length=255)

Однако есть небольшая проблема: FileField будет хранить весь сгенерированный путь, а не только имя, которого я бы хотел избежать. Есть ли способ переопределить (возможно, в моем собственном классе поля), что FileField записывает в базу данных и как он восстанавливает путь после загрузки необработанного поля?

1 Ответ

2 голосов
/ 28 мая 2009
name = models.FileField(upload_to=get_absolute_url, max_length=255)

upload_to обычно выглядит так

upload_to ='./files'

Он будет сохранен как ./files/your.file в БД и как <MEDIA_ROOT>/files/your.file на вашем диске

Вы можете изменить upload_to -строку на любую, наиболее подходящую для вас программно

upload_to ='./files'+'/subdir'

но оно должно начинаться с './'

FileField-Reference

get_absolute_url() должен возвращать URL как http://domain.com/sitemedia/files/your.file

EDIT:

чтобы удалить путь из имени файла, вы можете выполнять строковые операции в File.save (), например

def save(self, force_insert=False, force_update=False):
    self.name = self.name[self.name.rfind('/')+1:]
    super(File, self).save(force_insert, force_update)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...